“ ไฟล์ลายเซ็นไม่ถูกต้อง” เมื่อพยายามเรียกใช้. jar


450

โปรแกรมภาษาจาวาของฉันถูกทำแพคเกจในไฟล์ jar และใช้ประโยชน์จากไลบรารี่ไลบรารี, ปราสาทเด้ง รหัสของฉันรวบรวมได้ดี แต่การเรียกใช้ jar นำไปสู่ข้อผิดพลาดต่อไปนี้:

ข้อยกเว้นในเธรด "main" java.lang.SecurityException: สรุปไฟล์ลายเซ็นไม่ถูกต้องสำหรับแอตทริบิวต์หลัก Manifest

ฉันค้นหามากกว่าหนึ่งชั่วโมงเพื่อค้นหาคำอธิบายและพบว่ามีค่าน้อยมาก หากใครเคยเห็นข้อผิดพลาดนี้มาก่อนและสามารถให้ความช่วยเหลือฉันจะต้องรับผิดชอบ


1
คุณพยายามที่จะเซ็นขวดของคุณเอง? ถ้าเป็นเช่นนั้นคุณพยายามลงชื่อเข้าใช้อย่างไร?
Cogsy

ไม่อย่างน้อยฉันก็ไม่คิดว่าฉันเป็น Xcode อาจพยายามลงชื่อด้วยตนเอง แต่ดูเหมือนจะไม่มีการตั้งค่าใด ๆ ที่จะปิดการทำงานนี้

อย่าลืมตรวจสอบว่าขวดที่มีอินเทอร์เฟซที่ใช้งานได้รับการลงชื่อด้วยเช่นกัน!
gaurav

คำตอบ:


47

โซลูชันที่แสดงรายการที่นี่อาจมีตัวชี้

ไฟล์ลายเซ็นไม่ถูกต้องสำหรับแอตทริบิวต์หลักของ Manifest

บรรทัดล่าง:

อาจเป็นการดีที่สุดที่จะให้ jar เป็นทางการตามเดิมและเพียงเพิ่มเป็นการอ้างอิงในไฟล์รายการสำหรับไฟล์ jar ของแอปพลิเคชันของคุณ


3
ฉันจะสะท้อนสิ่งนี้ในไฟล์รายการได้อย่างไร ฉันไม่เคยแก้ไขมาก่อน ฉันกำลังใช้ Xcode และหลักการทั่วไปคือการใส่ไลบรารี่ jar ภายนอกลงในไดเรกทอรี myproject / lib เพื่อรวมซึ่งเป็นสิ่งที่ฉันกำลังทำอยู่

@ user123003 .. เป็นกรณีของ Intelli-J
MikeM

13
แต่น่าเสียดายที่บางส่วนของเราใช้สิ่งที่ชอบ "Maven ร่มปลั๊กอิน" เพื่อรวมทั้งสำเนาคำต่อคำของขวดต้นฉบับไม่ได้เป็นเรื่องง่ายในกรณีดังกล่าว ...
rogerdpack

ปลั๊กที่ไม่ระบุชื่อที่จะตอบในเว็บไซต์นี้ : stackoverflow.com/a/30922181/448779
foo

maven-assembly-plugin คืออะไร? จะแก้ไขปัญหานี้ในกรณีของฉัน
jhenya-d

1083

สำหรับผู้ที่ได้รับข้อผิดพลาดนี้เมื่อพยายามสร้างuber-jarด้วยmaven-shade-pluginวิธีแก้ไขคือการแยกไฟล์ลายเซ็นอย่างชัดแจ้งโดยเพิ่มบรรทัดต่อไปนี้ในการกำหนดค่าปลั๊กอิน:

<configuration>
    <filters>
        <filter>
            <artifact>*:*</artifact>
            <excludes>
                <exclude>META-INF/*.SF</exclude>
                <exclude>META-INF/*.DSA</exclude>
                <exclude>META-INF/*.RSA</exclude>
            </excludes>
        </filter>
    </filters>
    <!-- Additional configuration. -->
</configuration>

9
ฉันใช้วิธีนี้สำหรับ uber-jar ของฉันและใช้งานได้ดี มีตัวอย่าง POM เต็มรูปแบบที่maven.apache.org/plugins/maven-shade-plugin/examples/…ที่แสดงวิธีนี้ในการกรองไฟล์ที่รวมอยู่
M. Dudley

4
ฉันถูกล่อลวงให้เริ่มหัวข้อใหม่ทั้งหมด - แต่เนื่องจากนี่เป็นหมายเลข 1 ในผลลัพธ์ของ Google จึงดูเหมือนว่าจะเก็บไว้ที่นี่ บรรทัดที่แสดงในที่นี้อยู่ในไฟล์ POM ที่ฉันใช้ - และฉันยังคงได้รับข้อผิดพลาดด้านความปลอดภัยเมื่อเรียกใช้แอปพลิเคชัน มันสร้างได้ดี - และแน่นอนว่าทำงานได้ดีเมื่อไม่ได้ทำโถ Uber ตามที่คาดไว้ และในขณะที่เป็นตัวเลือกแน่นอน - แยกพวกเขา - มันไม่ได้แก้ปัญหาถ้าคุณต้องการ Uber Jar
Gavin Baumanis

7
ใช้งานได้สำหรับฉัน แต่ ... ทำไมเราต้องเพิกเฉยไฟล์ลายเซ็น? ฉันแน่ใจว่ารายการลายเซ็นมีเหตุผล ....
Jeryl Cook

4
อย่าลืมทำ "mvn clean" หลังจากทำข้างบน!
codeinjuice

4
@JerylCook ไฟล์ลายเซ็นต์อยู่ที่นั่นเพื่อระบุว่าเนื้อหาของ jar นี้มีไฟล์เหล่านี้ เมื่อคุณสร้าง uber jar คุณจะเพิ่มไฟล์จำนวนมากลงใน jar และทำให้ลายเซ็นไม่ถูกต้อง หากคุณต้องการจริงๆคุณสามารถลงนามไหใหม่ได้ แต่แน่นอนว่ามันจะมาพร้อมกับลายเซ็นของคุณไม่ใช่ของเก่า อีกทางหนึ่งคุณไม่สามารถแจกจ่าย uber jar ได้ แต่แทนที่จะรวม jar ที่ลงชื่อแล้วเป็นไฟล์แยกต่างหาก แต่หลังจากนั้นจะทำการทำลายวัตถุประสงค์ของ uber jar ในตอนแรก
LadyCailin

139

สำหรับผู้ที่ใช้ gradle และพยายามสร้างและใช้ jar ไขมันไวยากรณ์ต่อไปนี้อาจช่วยได้

jar {
    doFirst {
        from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
    }
    exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA' 
}

1
โดยทั่วไปจะเป็นการยกเว้นไฟล์ทั้งหมดที่มีนามสกุล. RSA, .SF หรือ. DSA ภายในไดเรกทอรี META-INF
Keith P

9
การเซ็นชื่อไฟล์ jar เพิ่มไฟล์เหล่านี้ภายใต้ META-INF แต่เมื่อรวมอยู่แล้วลายเซ็นจะไม่เห็นด้วยกับเนื้อหา jar อีกต่อไป ดังนั้นการลบมันจะหลีกเลี่ยงลายเซ็นที่ไม่ตรงกัน
Peter N. Steinmetz

1
มีคำถามที่คล้ายกันอย่างเคร่งครัดเกี่ยวกับการใช้ jar ไขมันใน gradle - stackoverflow.com/questions/4871656/ …
Tomasz Sętkowski

3
สิ่งนี้ไม่ได้ผลสำหรับฉัน ฉันต้องนำงานexcludeของฉันfatJarซึ่งมีconfigurations.compile.collectคำสั่งนั้น ดูstackoverflow.com/a/31426413/103412
Torsten

1
วิธีนี้จะช่วยแก้ไขข้อผิดพลาดได้ด้วยError: Could not find or load main class App Caused by: java.lang.ClassNotFoundException: App
vonox7

57

การขึ้นต่อกันของคุณบางครั้งน่าจะมีการลงนามใน jarfiles เมื่อคุณรวมทั้งหมดลงใน jarfile ขนาดใหญ่ไฟล์ลายเซ็นที่เกี่ยวข้องยังคงปรากฏอยู่และไม่ตรงกับ jarfile "รวมกันใหญ่" อีกต่อไปดังนั้นไทม์ไลน์จึงหยุดการทำงานเมื่อคิดว่าไฟล์ jar ถูกแก้ไข (ซึ่ง ... มี พูด).

คุณสามารถแก้ปัญหาได้โดยกำจัดไฟล์ลายเซ็นออกจากการพึ่งพาของ jarfile น่าเสียดายที่มันไม่สามารถทำได้ในขั้นตอนเดียวในมดมันเป็นไปไม่ได้ที่จะทำเช่นนี้ในขั้นตอนเดียวในมด

อย่างไรก็ตามฉันสามารถทำงานกับ Ant ได้สองขั้นตอนโดยไม่ต้องตั้งชื่อการพึ่งพาของ jarfile แต่ละอันโดยเฉพาะโดยใช้:

<target name="jar" depends="compile" description="Create one big jarfile.">
    <jar jarfile="${output.dir}/deps.jar">
        <zipgroupfileset dir="jars">
            <include name="**/*.jar" />
        </zipgroupfileset>
    </jar>
    <sleep seconds="1" />
    <jar jarfile="${output.dir}/myjar.jar" basedir="${classes.dir}">
        <zipfileset src="${output.dir}/deps.jar" excludes="META-INF/*.SF" />
        <manifest>
            <attribute name="Main-Class" value="com.mycompany.MyMain" />
        </manifest>
    </jar>
</target>

องค์ประกอบสลีปควรป้องกันข้อผิดพลาดเกี่ยวกับไฟล์ที่มีวันที่แก้ไขในอนาคตข้อผิดพลาดเกี่ยวกับไฟล์ที่มีการเปลี่ยนแปลงวันที่ในอนาคต

รูปแบบอื่น ๆ ที่ฉันพบในเธรดที่ลิงก์ไม่ทำงานสำหรับฉัน


เป็นไปได้ที่จะทำในขั้นตอนเดียวโดยใช้วิธีอื่นในการระบุขวดของคุณ: <jar destfile = "build / myjar.jar"> <restrict> <not> <not> <name name = "META-INF / *. SF" /> </not> <archives> <zips> <fileset dir = "jarfolder" รวมถึง = " * / .jar" /> </zips> </archives> </archives> </
restives

57

กรุณาใช้คำสั่งดังต่อไปนี้

zip -d yourjar.jar 'META-INF/*.SF' 'META-INF/*.RSA' 'META-INF/*SF'

4
ขอบคุณฉันมีปัญหากับ Intellij 14 และวิธีการแก้ปัญหาของคุณใช้ได้สำหรับฉัน!
Mohamad Kouhi Moghadam

5
ขอบคุณทำงานให้ฉันใน Windows เพิ่งเปิดขวดที่มี 7zip ลบไฟล์. SF ฉันไม่มีไฟล์. RSA ที่จะลบ
candino

3
ว้าวฉันขอพูดได้ไหมว่าวิธีแก้ปัญหานี้น่าทึ่งมาก (และฉันได้เรียนรู้บางสิ่งที่ทรงพลังมากระหว่างทาง!) สิ่งนี้ต้องการการปฏิวัติมากขึ้น
Dylan_Larkin

ฉันเห็นด้วยกับความคิดเห็นของ @Dylan_Larkin นี่คือสิ่งที่แก้ไขได้สำหรับฉัน
Felipe Valdes

26

ฉันมีปัญหานี้เมื่อใช้ IntelliJ IDEA 14.01

ฉันสามารถแก้ไขได้โดย:

ไฟล์ -> โครงสร้างโครงการ -> เพิ่มใหม่ (สิ่งประดิษฐ์) -> jar-> จากโมดูลที่ขึ้นอยู่กับหน้าต่างสร้าง Jar จากโมดูล:

เลือกชั้นเรียนหลัก

ไฟล์ JAR จากไลบรารี่เลือกคัดลอกไปยังไดเร็กทอรีเอาต์พุตและลิงก์ผ่านรายการ


2
เป็นไปได้หรือไม่ที่จะนำไหที่ต้องพึ่งพาเข้าไปในขวดเป้าหมาย?
coder.chenzhi

โซลูชันของคุณใช้งานได้ดี !! ขอบคุณมาก!
hzitoun

19

ความปลอดภัยเป็นหัวข้อที่ยากลำบากอยู่แล้ว แต่ฉันผิดหวังที่เห็นวิธีแก้ปัญหายอดนิยมที่สุดคือการลบลายเซ็นความปลอดภัย JCE ต้องใช้ลายเซ็นเหล่านี้ Maven เฉดสีจะระเบิดไฟล์ jar BouncyCastle ซึ่งใส่ลายเซ็นลงใน META-INF แต่ลายเซ็น BouncyCastle ไม่ถูกต้องสำหรับ uber-jar ใหม่ (สำหรับขวด jar BC เท่านั้น) และนั่นเป็นสาเหตุของข้อผิดพลาดลายเซ็นไม่ถูกต้องในชุดข้อความนี้ .

ใช่การยกเว้นหรือลบลายเซ็นตามที่แนะนำโดย @ruhsuzbaykus ทำให้ข้อผิดพลาดเดิมหายไป แต่มันสามารถนำไปสู่ข้อผิดพลาดใหม่ที่เป็นความลับ:

java.security.NoSuchAlgorithmException: PBEWithSHA256And256BitAES-CBC-BC SecretKeyFactory not available

โดยการระบุตำแหน่งที่จะค้นหาอัลกอริทึมเช่นนี้อย่างชัดเจน:

SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC","BC");

ฉันสามารถรับข้อผิดพลาดอื่น:

java.security.NoSuchProviderException: JCE cannot authenticate the provider BC

JCE ไม่สามารถตรวจสอบความถูกต้องของผู้ให้บริการได้เนื่องจากเราได้ลบลายเซ็นการเข้ารหัส โดยทำตามคำแนะนำที่อื่นในหัวข้อเดียวกันนี้นี้

วิธีแก้ปัญหาที่ฉันพบคือปลั๊กอินตัวเรียกใช้งานแพ็คเกอร์ที่ใช้วิธี jar-in-jar เพื่อรักษาลายเซ็น BouncyCastleใน jar ที่ทำงานได้แบบเดี่ยว

UPDATE :

วิธีการที่จะทำเช่นนี้ (วิธีที่ถูกต้อง?) ก็คือการใช้Maven Jar ลงนาม วิธีนี้ช่วยให้คุณสามารถใช้งาน Maven shade ได้โดยไม่เกิดข้อผิดพลาดด้านความปลอดภัย อย่างไรก็ตามคุณต้องมีใบรับรองการลงรหัส (Oracle แนะนำให้ค้นหา "ใบรับรองการลงนามรหัส Java") การกำหนดค่า POM มีลักษณะดังนี้:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <filters>
                    <filter>
                        <artifact>org.bouncycastle:*</artifact>
                        <excludes>
                            <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>
                </filters>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>your.class.here</mainClass>
                    </transformer>
                </transformers>
                <shadedArtifactAttached>true</shadedArtifactAttached>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jarsigner-plugin</artifactId>
    <version>1.4</version>
    <executions>
        <execution>
            <id>sign</id>
            <goals>
                <goal>sign</goal>
            </goals>
        </execution>
        <execution>
            <id>verify</id>
            <goals>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <keystore>/path/to/myKeystore</keystore>
        <alias>myfirstkey</alias>
        <storepass>111111</storepass>
        <keypass>111111</keypass>
    </configuration>
</plugin>

ไม่ไม่มีวิธีที่จะทำให้ JCE จดจำใบรับรองที่ลงนามเองได้ดังนั้นหากคุณต้องการเก็บใบรับรอง BouncyCastle คุณต้องใช้ปลั๊กอิน jar-in-jar หรือขอใบรับรอง JCE


นี่เป็นวิธีที่เหมาะสมในการทำแม้ว่ามันจะใช้งานได้อย่างเข้มข้นก็ตาม ขอบคุณสำหรับการชี้รายละเอียดคำเตือนที่ใช้คำตอบที่ได้รับการอนุมัติ คุณรู้หรือไม่ว่าใบรับรอง JCE นั้นต้องลงนามโดย Sun หรือไม่? หรือสามารถ
WiteCastle

1
มีบุคคลที่สามที่สามารถออกใบรับรองการเซ็นรหัส ค้นหา "ใบรับรองการลงนามรหัส Java" เพื่อดูตัวเลือก
MattW

คุณครับทำให้วันของฉัน!
socona

ช่วยฉันด้วย มีบางไฟล์ในห้องสมุดนี้ที่ฉันไม่ได้ใช้ดังนั้นยกเว้นพวกเขาจะช่วยฉันด้วยไฟล์ jar ไขมัน
34411

14

ฉันประสบปัญหาเดียวกันหลังจากการอ้างอิงบางแห่งมันทำงานได้ดังต่อไปนี้การเปลี่ยนแปลง:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.1</version>
    <configuration>
        <createDependencyReducedPom>false</createDependencyReducedPom>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <filters>
                    <filter>
                        <artifact>*:*</artifact>
                        <excludes>
                            <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>
                </filters>
            </configuration>
        </execution>
    </executions>
</plugin>

1
วิธีนี้แก้ไขปัญหาของฉันอย่างรวดเร็ว! เพื่อความสมบูรณ์ควรจะอยู่ในmaven-shade-pluginแท็ก
Kuzeko

1
@Kuzeko อัปเดต anwser ด้วยคำแนะนำของคุณ ขอบคุณ
m.nguyencntt

8

สมมติว่าคุณสร้างไฟล์ jar ด้วยมดคุณสามารถสั่งมดให้ออกจาก dir META-INF นี่เป็นเป้าหมายมดของฉันที่เรียบง่าย:

<jar destfile="app.jar" basedir="${classes.dir}">
    <zipfileset excludes="META-INF/**/*" src="${lib.dir}/bcprov-jdk16-145.jar"></zipfileset>
    <manifest>
        <attribute name="Main-Class" value="app.Main"/>
    </manifest>
</jar>

ฉันควรเพิ่มบรรทัดเหล่านี้ที่ไหน
Addi.Star

4

ฉันเพิ่งเริ่มใช้ IntelliJ ในโครงการของฉัน อย่างไรก็ตามเพื่อนร่วมงานของฉันบางคนยังคงใช้ Eclipse ในโครงการเดียวกัน วันนี้ฉันมีข้อผิดพลาดเดียวกันหลังจากเรียกใช้ jar-file ที่สร้างโดย IntelliJ ของฉัน ในขณะที่การแก้ปัญหาทั้งหมดในที่นี่พูดถึงเกือบเหมือนกันไม่มีใครทำงานให้ฉันได้อย่างง่ายดาย (อาจเป็นเพราะฉันไม่ได้ใช้ ANT แต่ maven build ให้ข้อผิดพลาดอื่น ๆ ซึ่งทำให้ฉันทราบถึงhttp://cwiki.apache.org/ ไหลมารวมกัน / แสดง / MAVEN / MojoExecutionExceptionและฉันก็ไม่สามารถหาขวดที่ลงนามด้วยตัวเอง!)

ในที่สุดสิ่งนี้ช่วยฉัน

zip -d demoSampler.jar 'META-INF/*.SF' 'META-INF/*.RSA' 'META-INF/*SF'

คาดเดาสิ่งที่ถูกลบออกจากไฟล์ jar ของฉัน!

deleting: META-INF/ECLIPSE_.SF 
deleting: META-INF/ECLIPSE_.RSA

ดูเหมือนว่าปัญหาเกี่ยวข้องกับไฟล์ที่เกี่ยวข้องกับ eclipse


4

ฉันมีปัญหาเดียวกันgradleเมื่อสร้าง Fat Jar การอัปเดตbuild.gradleไฟล์โดยใช้บรรทัดที่แยกออกเพื่อแก้ไขปัญหา

jar {
    from {
        configurations.compile.collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }
    exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
    manifest {
        attributes 'Main-Class': 'com.test.Main'
    }
}

1
ฉันได้ทำการดีบั๊กมาหลายวันวิธีนี้แก้ปัญหากระปุกไขมันของฉันได้
sysuser

วิธีที่ฉันดีบั๊กคือการใส่ jar ไขมันในไดเรกทอรี jmeter หากคุณมีขวดที่มีปัญหาใน lib / ext ปัญหานี้จะไม่ชัดเจน แต่คุณจะได้รับข้อผิดพลาดเหมือนหนึ่งในstackoverflow.com/questions/37624187/ …
sysuser

1
ไม่รวม 'META-INF / *. RSA', 'META-INF / *. SF', 'META-INF / *. DSA' นี่หายไปบางขวดขึ้นอยู่ทำให้เกิดปัญหา
Nirbhay Mishra

3

ในกรณีที่คุณกำลังใช้ gradle นี่คืองาน FarJar แบบเต็ม:

version = '1.0'
//create a single Jar with all dependencies
task fatJar(type: Jar) {
    manifest {
        attributes 'Implementation-Title': 'Gradle Jar File Example',  
            'Implementation-Version': version,
            'Main-Class': 'com.example.main'
    }
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA' 
    with jar
}

2

เปรียบเทียบโฟลเดอร์ META-INF ใน jar ใหม่กับ jar เก่า (ก่อนที่คุณจะเพิ่มไลบรารีใหม่) เป็นไปได้ว่าจะมีไฟล์ใหม่ ถ้าใช่คุณสามารถลบได้ มันควรจะช่วย ขอแสดงความนับถือ 999michal


2

กลยุทธ์จะประกอบด้วยการใช้ ANT เพื่อทำให้การลบลายเซ็นออกจากแต่ละไฟล์ Jar ง่ายขึ้น มันจะดำเนินการตามขั้นตอนต่อไปนี้:

  1. คัดลอก MANIFEST.MF ในไฟล์ชั่วคราว
  2. การลบรายการชื่อและSHAออกจากไฟล์ชั่วคราว
  3. การสร้างไฟล์ Jar ชั่วคราวด้วยรายการชั่วคราว
  4. การลบรายการชั่วคราว
  5. การแลกเปลี่ยนไฟล์ Jar ดั้งเดิมด้วยไฟล์ชั่วคราว

นี่คือmacrodef ANTที่ทำงาน:

<macrodef name="unsignjar" description="To unsign a specific Jar file">
    <attribute name="jarfile" 
        description="The jar file to unsign" />
    <sequential>
<!-- Copying to the temporary manifest file -->
        <copy toFile="@{jarFile}_MANIFEST.tmp">
            <resources>
                <zipentry zipfile="@{jarFile}" name="META-INF/MANIFEST.MF"/>
            </resources>
        </copy>
<!-- Removing the Name and SHA entries from the temporary file -->
        <replaceregexp file="@{jarFile}_MANIFEST.tmp" match="\nName:(.+?)\nSH" replace="SH" flags="gis" byline="false"/>
        <replaceregexp file="@{jarFile}_MANIFEST.tmp" match="SHA(.*)" replace="" flags="gis" byline="false"/>
<!-- Creating a temporary Jar file with the temporary manifest -->
        <jar jarfile="@{jarFile}.tmp"
            manifest="@{jarFile}_MANIFEST.tmp">
            <zipfileset src="@{jarFile}">
                <include name="**"/>
                <exclude name="META-INF/*.SF"/>
                <exclude name="META-INF/*.DSA"/>
                <exclude name="META-INF/*.RSA"/>
            </zipfileset>
        </jar>
<!-- Removing the temporary manifest -->
        <delete file="@{jarFile}_MANIFEST.tmp" />
<!-- Swapping the original Jar file with the temporary one -->
        <move file="@{jarFile}.tmp"
              tofile="@{jarFile}"
              overwrite="true" />
</sequential>

`

คำจำกัดความนั้นสามารถเรียกได้ด้วยวิธีนี้ในภารกิจ ANT:

<target name="unsignJar">
    <unsignjar jarFile="org.test.myjartounsign.jar" />
</target>

2

ข้อผิดพลาด: เกิดข้อผิดพลาด JNI โปรดตรวจสอบการติดตั้งของคุณแล้วลองอีกครั้งข้อยกเว้นในเธรด "main" java.lang.SecurityException: ไฟล์สรุปลายเซ็นไม่ถูกต้องสำหรับแอตทริบิวต์หลัก Manifest ที่ sun.security.util.SignatureFileVerifier.processImpl (SignatureFileVerifier.java: 314) ที่ sun.security.util.SignatureFileVerifier.process (SignatureFileVerifier.java:268) ที่ java.util.jar.JarVerifier.processEntry (JarVerifier.java:316) ที่ java.util.jar.JarVerifier.update (JarVerifier.java) : 228) ที่ java.util.jar.JarFile.initializeVerifier (JarFile.java:383) ที่ java.util.jar.JarFile.getInputStream (JarFile.java:450) ที่ sun.misc.URClassPath $ Jarloader $ 2.getInputStream .java: 977) ที่ sun.misc.Resource.cachedInputStream (Resource.java:77) ที่ sun.misc.Resource.getByteBuffer (Resource.java:160) ที่ java.net.URLClassLoader.defineClass (URLClassLoader.java:454) ที่ java.net.URLClassLoader.access $ 100 (URLClassLoader.java:73) ที่ java.net.URLClassLoader $ 1.run (URLClassLoader.java:368) java.net.URLClassLoader $ 1.run (URLClassLoader.java:362) ที่ java.security.AccessController.doPrivileged (เมธอด Native) ที่ java.net.URLClassLoader.findClass (URLClassLoader.java:361) ที่ java.lang.ClassLoader.loadClass (ClassLoader.java:424) ที่ sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:331) ที่ java.lang.ClassLoader.loadClass (ClassLoader.java:357) ที่ sun.launcher.Launcher.Launcher (Launcher.java:33) Java: 495)รัน (URLClassLoader.java:368) ที่ java.net.URLClassLoader $ 1.run (URLClassLoader.java:362) ที่ java.security.AccessController.doPrivileged (วิธีการดั้งเดิม) ที่ java.net.URLClassLoader.findClass ) ที่ java.lang.ClassLoader.loadClass (ClassLoader.java:424) ที่ sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:331) ที่ java.lang.ClassLoader.loadClass (ClassLoader.java:3535) .launcher.LauncherHelper.checkAndLoadMain (LauncherHelper.java:495)รัน (URLClassLoader.java:368) ที่ java.net.URLClassLoader $ 1.run (URLClassLoader.java:362) ที่ java.security.AccessController.doPrivileged (วิธีการดั้งเดิม) ที่ java.net.URLClassLoader.findClass ) ที่ java.lang.ClassLoader.loadClass (ClassLoader.java:424) ที่ sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:331) ที่ java.lang.ClassLoader.loadClass (ClassLoader.java:3535) .launcher.LauncherHelper.checkAndLoadMain (LauncherHelper.java:495)331) ที่ java.lang.ClassLoader.loadClass (ClassLoader.java:357) ที่ sun.launcher.LauncherHelper.checkAndLoadMain (LauncherHelper.java:495)331) ที่ java.lang.ClassLoader.loadClass (ClassLoader.java:357) ที่ sun.launcher.LauncherHelper.checkAndLoadMain (LauncherHelper.java:495)

สิ่งที่ช่วยฉันได้ (IntelliJ IDEA 2016.3): ไฟล์ -> โครงสร้างโครงการ -> สิ่งประดิษฐ์ -> เพิ่ม JAR -> เลือกคลาสหลัก -> เลือก "คัดลอกไปยังไดเรกทอรีเอาต์พุตและลิงก์ผ่านรายการ" -> ตกลง -> ใช้ -> Build -> > สร้างสิ่งประดิษฐ์ ... -> สร้าง


1

เป็นไปได้ว่าผู้ลงนามที่แตกต่างกันสองคนสับสนกับความคิดของจาวา

ลองลบโฟลเดอร์ META-INF จาก jar เพิ่มรายการและลงนาม JAR อีกครั้งมันช่วยฉันได้: http://jehy.ru/articles/2013/12/13/invalid-signature-file-digest-for-manifest-main- คุณลักษณะ/


1
+1 สำหรับลิงก์ การลบ META-INF * .RSA และ META-INF * .SF ออกจากขวดที่ฉันทำงานด้วยแก้ไขปัญหาให้ฉันแล้ว YMMV
KathyA

1

หากคุณกำลังมองหาวิธีการแก้ปัญหา JAR ไขมันโดยไม่ต้องเอาออกหรือยุ่งเกี่ยวกับห้องสมุดเดิม แต่มี ClassLoader JAR พิเศษดูที่โครงการของฉันที่นี่

ข้อจำกัดความรับผิดชอบ: ฉันไม่ได้เขียนรหัสเพียงแค่บรรจุและเผยแพร่บน Maven Central และอธิบายวิธีการใช้งานให้ฉัน

ฉันใช้มันเป็นการส่วนตัวเพื่อสร้าง JAR uber ที่ทำงานได้ซึ่งมีการอ้างอิง BouncyCastle อาจเป็นประโยชน์สำหรับคุณเช่นกัน


0

สำหรับผู้ที่มีปัญหากับโซลูชันที่ยอมรับมีวิธีอื่นในการแยกทรัพยากรออกจาก jar สีเทาด้วย DontIncludeResourceTransformer:

https://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#DontIncludeResourceTransformer

          <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                <resource>BC1024KE.DSA</resource>
            </transformer>
          </transformers>

จาก Shade 3.0 หม้อแปลงนี้ยอมรับรายการทรัพยากร ก่อนหน้านี้คุณต้องใช้หม้อแปลงหลายตัวพร้อมกัน


0

สิ่งนี้เกิดขึ้นกับฉันใน Intellij เมื่อฉันคลิก "เพิ่มเป็นโครงการ Maven" ที่บรรทัดล่างเมื่อ Intellij กล่าวว่า "พบไฟล์ pom ที่ไม่มีการจัดการ" สร้างโฟลเดอร์ใหม่แล้ว ดังนั้นจึงไม่ได้รับการเปลี่ยนแปลงล่าสุด

การลบโฟลเดอร์ออกและเรียกใช้โปรแกรมเพื่อแก้ไขปัญหาให้ฉัน สร้างโฟลเดอร์ใหม่แล้ว

ดูคำตอบของ Little Fox เช่นกัน ข้อผิดพลาดที่ฉันได้รับนั้นคล้ายคลึงกับของเขามาก


-1

ฉันมีปัญหาที่คล้ายกัน เหตุผลก็เพราะฉันรวบรวมโดยใช้ JDK ที่มี JRE แตกต่างจากค่าเริ่มต้นในกล่อง Windows ของฉัน

ใช้ java.exe ที่ถูกต้องแก้ปัญหาของฉัน


-2

หากคุณได้รับสิ่งนี้เมื่อพยายามผูกไฟล์ JAR สำหรับ Xamarin.Android โครงการผูกเช่น:

JARTOXML: คำเตือน J2XA006: ข้อผิดพลาดของคลาสที่ขาดหายไปถูกยกขณะสะท้อน com.your.class: ไฟล์สรุปลายเซ็นไม่ถูกต้องสำหรับแอตทริบิวต์หลัก Manifest

เพียงเปิดไฟล์ JAR โดยใช้ Winzip และลบไดเรกทอรี meta-inf สร้างใหม่ - งานเสร็จสิ้น


1
นี่เป็นเทคนิคที่น่ากลัว น่ากลัวอย่างยิ่ง ทำการแก้ไขภายในเครื่องอย่าทำการเปลี่ยนแปลงไหที่เข้ามา
sinisterrook
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.