.Jar चलाने का प्रयास करते समय "अमान्य हस्ताक्षर फ़ाइल"


450

मेरा जावा प्रोग्राम जार फ़ाइल में पैक किया गया है और बाहरी जार लाइब्रेरी, बाउंसी महल का उपयोग करता है । मेरा कोड ठीक संकलित करता है, लेकिन जार को चलाने से निम्नलिखित त्रुटि होती है:

थ्रेड में अपवाद "मुख्य" java.lang.SecurityException: मैनिफेस्ट मुख्य विशेषताओं के लिए अमान्य हस्ताक्षर फ़ाइल डाइजेस्ट

मैंने एक घंटे तक स्पष्टीकरण के लिए खोज की है और बहुत कम मूल्य पाया है। अगर किसी ने पहले इस त्रुटि को देखा है और कुछ मदद दे सकता है, तो मैं बाध्य होऊंगा।


1
क्या आप अपने स्वयं के जार पर हस्ताक्षर करने की कोशिश कर रहे हैं? यदि हां, तो आप इस पर हस्ताक्षर करने का प्रयास कैसे कर रहे हैं?
Cogsy

नहीं, कम से कम मुझे नहीं लगता कि मैं हूं। Xcode इसे अपने आप से साइन करने का प्रयास कर सकता है, लेकिन इसे बंद करने के लिए कोई सेटिंग नहीं दिखाई देती है।

यह जांचने के लिए मत भूलना कि क्या लागू इंटरफेस वाले जार भी हस्ताक्षरित हैं!
गौरव

जवाबों:


47

यहां सूचीबद्ध समाधान एक संकेतक प्रदान कर सकता है।

मैनिफेस्ट मुख्य विशेषताओं के लिए अमान्य हस्ताक्षर फ़ाइल डाइजेस्ट

जमीनी स्तर :

यह शायद आधिकारिक जार रखने के लिए सबसे अच्छा है और बस इसे अपने आवेदन जार फ़ाइल के लिए प्रकट फ़ाइल में एक निर्भरता के रूप में जोड़ें।


3
मैं इसे मैनिफ़ेस्ट फ़ाइल में कैसे दिखाऊँगा? मैंने पहले कभी नहीं संपादित किया है। मैं Xcode का उपयोग कर रहा हूं, और आम सम्मेलन में बाहरी जार पुस्तकालयों को शामिल करने के लिए myproject / lib निर्देशिका में रखा गया है, जो कि मैं कर रहा हूं।

@ user123003 .. जैसा कि इंटेली-जे के साथ मामला है
माइक जूल

13
दुर्भाग्य से हम में से कुछ "मावेन शेड प्लगइन" जैसी चीजों का उपयोग करते हैं, इसलिए मूल जार की
वर्बेटिम प्रतियां

इस साइट पर जवाब देने के लिए बेशर्म प्लग : stackoverflow.com/a/30922181/448779
foo

मावेन-असेंबली-प्लगइन के बारे में क्या? यह मेरे मामले में इस मुद्दे को हल करता है
jhenya-d

1083

जो लोग जब एक बनाने का प्रयास कर यह त्रुटि आई के लिए uber-जार के साथ 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 के लिए इस विधि का उपयोग किया, और इसने बहुत अच्छा काम किया। Maven.apache.org/plugins/maven-shade-plugin/examples/… पर एक पूर्ण POM उदाहरण मौजूद है जो इस विधि को शामिल फ़ाइलों को फ़िल्टर करने से पता चलता है।
एम। डडले

4
मुझे एक नया सूत्र शुरू करने का प्रलोभन दिया गया था - लेकिन जब से गोगल्स परिणामों में यह नंबर 1 है - इसे यहां रखना उचित नहीं लगा। यहां सूचीबद्ध लाइनें POM फ़ाइल में हैं जो मैं उपयोग कर रहा हूं - और एप्लिकेशन को चलाते समय मुझे अभी भी सुरक्षा त्रुटि मिल रही है। यह ठीक बनाता है - और निश्चित रूप से ठीक चलता है जब एक Uber जार नहीं कर रहा है - जैसा कि अपेक्षित था। और जब कि निश्चित रूप से एक विकल्प है - उन्हें अलग रखें - अगर आप उबर जार चाहते हैं तो यह मुद्दे को हल नहीं करता है।
गाविन बाउमनिस

7
यह मेरे लिए काम करता है लेकिन ... हमें हस्ताक्षर फ़ाइलों को अनदेखा क्यों करना पड़ा? मुझे यकीन है कि एक कारण के लिए हस्ताक्षर प्रकट होते हैं ....
जेरीएल कुक

4
ऊपर करने के बाद "mvan साफ" करना सुनिश्चित करें!
कोडिनजाइस

4
@JerylCook हस्ताक्षर फ़ाइलें इस जार की सामग्री इन फ़ाइलों को इंगित करने के लिए वहाँ हैं। जब आप एक uber जार बनाते हैं, तो आप जार में और अधिक फ़ाइलों का एक गुच्छा जोड़ रहे हैं, और इस प्रकार हस्ताक्षर सही नहीं है। यदि आप वास्तव में चाहते थे, तो आप नए जार पर फिर से हस्ताक्षर कर सकते थे, लेकिन निश्चित रूप से यह आपके हस्ताक्षर के साथ होगा, पुराना नहीं। वैकल्पिक रूप से, आप uber जार को वितरित नहीं कर सकते, बल्कि हस्ताक्षरित जार को एक अलग फ़ाइल के रूप में शामिल कर सकते हैं, लेकिन तब यह पहली जगह में uber जार के उद्देश्य को हरा देता है।
लेडीकैलिन

139

वसा का उपयोग करने वाले और वसा जार को बनाने और उपयोग करने की कोशिश करने वालों के लिए, निम्नलिखित सिंटैक्स मदद कर सकता है।

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

1
यह सिर्फ मूल रूप से META-INF निर्देशिका के अंदर .RSA, .SF, या .DSA के एक्सटेंशन वाली सभी फ़ाइलों को शामिल नहीं करता है।
कीथ पी

9
जार फ़ाइल पर हस्ताक्षर करना मेटा-इन के तहत इन फ़ाइलों को जोड़ता है, लेकिन जब वे शामिल होते हैं, तो हस्ताक्षर अब जार सामग्री से सहमत नहीं होते हैं। इस प्रकार उन्हें हटाने से हस्ताक्षर बेमेल से बचा जाता है।
पीटर एन। स्टाइनमेटज़

1
एक समान प्रश्न सख्ती से
ग्रेड

3
यह मेरे लिए काम नहीं किया। मुझे excludeअपना fatJarकार्य करना था, जिसमें वह configurations.compile.collectआदेश था। देखें stackoverflow.com/a/31426413/103412
टॉरस्टेन

1
यह भी त्रुटि हल करता हैError: Could not find or load main class App Caused by: java.lang.ClassNotFoundException: App
vonox7

57

आपके आश्रितों में से कुछ पर हस्ताक्षर किए जाने वाले जरीफाइल हैं। जब आप उन सभी को एक बड़े जर्फ़ाइल में संयोजित करते हैं, तो संबंधित हस्ताक्षर फ़ाइलें अभी भी मौजूद हैं, और अब "बड़े संयुक्त" शब्द के साथ मेल नहीं खाती हैं, इसलिए रन फ़ाइल को यह सोचने से रोकती है कि जार फ़ाइल के साथ छेड़छाड़ की गई है (जो कि ... ऐसा है) बोले)।

आप अपने जरीफाइल निर्भरता से हस्ताक्षर फ़ाइलों को समाप्त करके समस्या को हल कर सकते हैं। दुर्भाग्य से, चींटी में एक कदम में ऐसा करना संभव नहीं है

हालाँकि, मैं चींटी के साथ यह काम दो चरणों में करने में सक्षम था, विशेष रूप से प्रत्येक जारफाइल निर्भरता का नाम लिए बिना, उपयोग करके:

<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"> <प्रतिबंधित> <not> <name name = "META-INF / *। SF" />। </ नहीं> <अभिलेखागार> <ज़िप> <fileset dir = "jarfolder" में = " * / .jar" /> </ zips> </ अभिलेखागार> </ प्रतिबंधित> </ jar>
डायटपैड

57

कृपया निम्न कमांड का उपयोग करें

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

4
धन्यवाद, मुझे यह समस्या १४ के साथ लगी और आपका समाधान मेरे लिए काम करता है!
मोहम्मद कोही मोघदाम

5
धन्यवाद, विंडोज में मेरे लिए काम किया। बस 7zip के साथ जार खोला, .SF फ़ाइलों को हटा दिया। मेरे पास हटाने के लिए कोई
.RSA

3
वाह, क्या मैं यह कह सकता हूं कि यह समाधान अद्भुत था (और मैंने रास्ते में बहुत शक्तिशाली कुछ सीखा!) इसके लिए और अधिक उत्थान की आवश्यकता है।
Dylan_Larkin

मैं @Dylan_Larkin की टिप्पणी से सहमत हूं, यही मेरे लिए इसका हल है।
फेलिप वैलेड्स

26

IntelliJ IDEA 14.01 का उपयोग करते समय मुझे यह समस्या थी।

मैं इसे ठीक करने में सक्षम था:

फ़ाइल-> प्रोजेक्ट संरचना-> नई जोड़ें (कलाकृतियाँ) -> जार-> मॉड्यूल से निर्भरता के साथ मॉड्यूल बनाएँ विंडो से जार पर:

आप मुख्य वर्ग का चयन करें

पुस्तकालयों से JAR फ़ाइल आउटपुट निर्देशिका में कॉपी करें और प्रकट के माध्यम से लिंक करें


2
क्या आश्रित जार को लक्ष्य जार में रखना संभव है?
coder.chenzhi

आपके समाधान ठीक काम करते हैं !! बहुत धन्यवाद!
हाइजीन

19

सुरक्षा पहले से ही एक कठिन विषय है, लेकिन मैं सबसे लोकप्रिय समाधान यह देखकर निराश हूं कि सुरक्षा हस्ताक्षर हटाना है। JCE को इन हस्ताक्षरों की आवश्यकता है । Maven शेड BouncyCastle जार फ़ाइल को विस्फोट करता है जो हस्ताक्षर को META-INF में डालता है, लेकिन BouncyCastle हस्ताक्षर नए, uber-jar (केवल BC jar के लिए) के लिए मान्य नहीं हैं, और इस धागे में अमान्य हस्ताक्षर त्रुटि का कारण बनता है

हां, @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

जेसीई प्रदाता को प्रमाणित नहीं कर सकता क्योंकि हमने क्रिप्टोग्राफिक हस्ताक्षरों को इसी धागे में कहीं और सुझाव का पालन करके हटा दिया है

मुझे जो समाधान मिला वह निष्पादन योग्य पैकर प्लगइन था जो एक एकल, निष्पादन योग्य जार में बाउंसीकैस्टल हस्ताक्षर को संरक्षित करने के लिए जार-इन-जार दृष्टिकोण का उपयोग करता है ।

अद्यतन :

ऐसा करने का एक और तरीका (सही तरीका?) मावेन जार साइनर का उपयोग करना है । यह आपको सुरक्षा त्रुटियों को प्राप्त किए बिना मावेन छाया का उपयोग करने की अनुमति देता है। फिर भी, आपके पास एक कोड हस्ताक्षर प्रमाणपत्र होना चाहिए (ओरेकल "जावा कोड साइनिंग सर्टिफिकेट" की खोज करने का सुझाव देता है)। पोम विन्यास इस तरह दिखता है:

<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 प्रमाणपत्र प्राप्त करना होगा।


यह निश्चित रूप से इसे करने का सही तरीका है, भले ही यह गहन काम हो। विस्तार से इंगित करने के लिए धन्यवाद, स्वीकृत उत्तर का उपयोग करने के साथ चेतावनी। क्या आपको पता है कि जेसीई सर्टिफिकेट पर सूर्य का हस्ताक्षर होना चाहिए? या कर सकते हैं
WiteCastle

1
तीसरे पक्ष हैं जो कोड साइनिंग सेर जारी कर सकते हैं। विकल्प देखने के लिए "जावा कोड साइनिंग सर्टिफिकेट" खोजें।
मैटडब्ल्यू

आप, सर, मेरा दिन बना दिया!
सोसोना

मेरे लिए मदद की। इस लाइब्रेरी में कुछ फाइलें हैं, जिनका मैं उपयोग नहीं करता, इसलिए उनके अलावा मुझे मोटी-जार फ़ाइल के साथ मदद करने के लिए
Saidolim

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टैग में जाना चाहिए ।
कुजेको

1
@Kuzeko अपने सुझाव के साथ अद्यतित awser। धन्यवाद
m.nguyencntt

8

यदि आप चींटी के साथ अपनी जार फाइल बनाते हैं, तो आप केवल चींटी को मेटा-इंफो डायर छोड़ने का निर्देश दे सकते हैं। यह मेरे चींटी लक्ष्य का एक सरलीकृत संस्करण है:

<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 द्वारा बनाई गई जार-फ़ाइल को निष्पादित करने के बाद बहुत ही त्रुटि मिली है। जबकि यहां सभी समाधान लगभग एक ही बात के बारे में बात कर रहे हैं, उनमें से किसी ने भी मेरे लिए आसानी से काम नहीं किया (संभवतः क्योंकि मैं एएनटी का उपयोग नहीं करता हूं, मावेन बिल्ड ने मुझे अन्य त्रुटियां दीं जो मुझे http://cwiki.apache.org/ के लिए संदर्भित करती हैं। संगम / प्रदर्शन / MAVEN / MojoExecutionException , और यह भी कि मैं अपने बारे में हस्ताक्षर किए गए लोगों को पता नहीं लगा सका!)

अंत में, यह मुझे मदद की

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

लगता है क्या मेरे जार फ़ाइल से हटा दिया गया है ?!

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

ऐसा लगता है कि यह मुद्दा कुछ ग्रहण-प्रासंगिक फाइलों के लिए प्रासंगिक था।


4

मेरे पास एक ही मुद्दा था gradleजब एक फैट जार बनाने के लिए, 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
मैं दिनों के लिए डिबगिंग कर रहा था, इससे मेरी मोटी जार समस्या हल हो गई।
सिसुसर

जिस तरह से मैंने डिबग किया है वह फैट जार को जेबर लिबर डायरेक्टरी में डालना है। यदि आपके पास समस्याग्रस्त जार lib / ext में है, तो यह समस्या स्पष्ट नहीं होगी, बल्कि आपको stackoverflow.com/questions/37624187/…
sysuser

1
'META-INF / *। RSA', 'META-INF / *। SF', 'META-INF / *। * DSA' को छोड़ दें, तो यह गायब था, कुछ आश्रित जार इस मुद्दे को पैदा कर रहे थे
निर्भय मिश्रा

3

यदि आप ग्रेडिंग का उपयोग कर रहे हैं, तो यहां एक पूर्ण कार्य है:

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

पुराने जार के साथ नए जार में फ़ोल्डर मेटा-इन की तुलना करें (इससे पहले कि आप नए पुस्तकालयों को जोड़े)। यह संभावना है कि नई फाइलें होंगी। यदि हाँ, तो आप उन्हें हटा सकते हैं। इसकी मदद करनी चाहिए। सादर, 999michal


2

प्रत्येक जार फ़ाइल से हस्ताक्षर को हटाने के लिए ANT का उपयोग करने में एक रणनीति शामिल होगी। यह निम्नलिखित चरणों के साथ आगे बढ़ेगा:

  1. अस्थायी फ़ाइल में MANIFEST.MF की प्रतिलिपि बनाना
  2. अस्थायी फ़ाइल से नाम और SHA प्रविष्टियाँ निकालना
  3. अस्थायी प्रकट के साथ एक अस्थायी जार फ़ाइल बनाना
  4. अस्थायी प्रकटन को हटाना
  5. अस्थायी के साथ मूल जार फ़ाइल को स्वैप करना

यहाँ एक चींटी काम कर रहा है:

<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 त्रुटि हुई है, कृपया अपनी स्थापना जांचें और थ्रेड में मुख्य "java.lang.SecurityException" अपवाद को आज़माएं: अमान्य हस्ताक्षर फ़ाइल मुख्य रूप से sun.security.util.stil.SileFileVerifier.processImpl (SignatureFileVerifier.java: पर मुख्य विशेषताओं के लिए डाइजेस्ट करें। 314) sun.security.util.ignature.SileatureFileVerifier.process पर (signatureFileVerifier.java:268) java.util.jar.JarVerifier.processEryry (JarVerifier.java:316) पर java.util.jar.JarVVifierifier। : 228) पर java.util.jar.JarFile.initializeVerifier (JarFile.java:383) java.util.jar.JarFile.getInputStream (JarFile.java:450) पर sun.misc.urLClassPath $ JarLoader $ 2.get, Input URL पर क्लिक करें। .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.lang पर java.net.URLClassLoader $ 1.run (URLClassLoader.java:362) जावा में। java.urLClassLoader.findClass (URLClassLoader.java:361) java.security। (ClassLoader.java:424) sun.misc.Launcher पर $ AppClassLoader.loadClass (Launcher.java:331) पर java.lang.ClassLoader.loadClass (ClassLoader.java:357) sun.launcher.LauncherHelper.checkAndL.co/ जावा: 495)java.net.URLClassLoader $ 1.run (URLClassLoader.java:368) रन 1.run (URLClassLoader.java:362) java.security.AccessController.doPrivileged (मूल विधि) पर java.net.URLClassLoader.findClass (URLClass) के लिए। ) java.lang.ClassLoader.loadClass (ClassLoader.java:424) पर sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:331) java.lang.ClassLoader.loadClass (ClassLoader.java:357) पर। .launcher.LauncherHelper.checkAndLoadMain (LauncherHelper.java:495)java.net.URLClassLoader $ 1.run (URLClassLoader.java:368) रन 1.run (URLClassLoader.java:362) java.security.AccessController.doPrivileged (मूल विधि) पर java.net.URLClassLoader.findClass (URLClass) के लिए। ) java.lang.ClassLoader.loadClass (ClassLoader.java:424) पर sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:331) java.lang.ClassLoader.loadClass (ClassLoader.java:357) पर। .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): फ़ाइल -> परियोजना संरचना -> कलाकृतियाँ -> जार जोड़ें -> मुख्य वर्ग का चयन करें - "आउटपुट निर्देशिका में प्रतिलिपि चुनें और प्रकट के माध्यम से लिंक करें" -> ठीक है -> लागू करें - निर्माण - निर्माण > कलाकृतियों का निर्माण ... -> निर्माण


1

यह संभव है कि दो अलग हस्ताक्षरकर्ता जावा दिमाग को गड़बड़ कर दें।

जार से META-INF फ़ोल्डर को हटाने की कोशिश करें, प्रकट और JAR को फिर से जोड़ने पर, इससे मुझे मदद मिली: http://jehy.ru/articles/2013/12/13/invalid-signature-file-digest-for-manifest-main- गुण /


1
लिंक के लिए +1। META-INF * .RSA और META-INF * .SF को जार से हटाकर मैं अपने लिए हल किए गए मुद्दों के साथ काम कर रहा था। YMMV
कैथी।

1

यदि आप मूल पुस्तकालयों के साथ बिना किसी छेड़छाड़ या छेड़छाड़ के एक फैट जार समाधान की तलाश कर रहे हैं, लेकिन एक विशेष जार क्लास लोडर के साथ, यहां मेरी परियोजना पर एक नज़र डालें ।

डिस्क्लेमर: मैंने कोड नहीं लिखा, बस इसे पैकेज किया और इसे मावेन सेंट्रल पर प्रकाशित किया और अपने रीड-मी में वर्णन किया कि इसका उपयोग कैसे किया जाए।

मैं व्यक्तिगत रूप से इसे चलाने योग्य uber JARs बनाने के लिए उपयोग करता हूं जिसमें BouncyCastle निर्भरताएं हैं। शायद यह आपके लिए भी उपयोगी हो।


0

जिन लोगों को स्वीकृत समाधान से परेशानी है, उनके लिए संसाधन का एक और तरीका नहीं है कि डॉन्टइनक्लूडएंड सोर्सऑनफॉर्मर के साथ छायांकित जार से बाहर रखा जाए:

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>

शेड 3.0 से, यह ट्रांसफार्मर संसाधनों की एक सूची को स्वीकार करता है। इससे पहले आपको बस एक संसाधन के साथ कई ट्रांसफार्मर का उपयोग करना होगा।


0

Intellij में मेरे साथ ऐसा हुआ जब मैंने Intellij के "नॉन-मैनेज्ड पोम फाइल्स" मिलने पर नीचे की लाइन पर "Add as a Maven Project" पर क्लिक किया। इस बीच बाहर फ़ोल्डर पहले से ही उत्पन्न किया गया था। इसलिए इसे हाल के बदलाव नहीं मिले।

फ़ोल्डर को हटाने और प्रोग्राम को चलाने से मेरे लिए समस्या हल हो गई। फ़ोल्डर बाहर फिर से बनाया गया था।

लिटिल फॉक्स का जवाब भी देखें। मुझे जो त्रुटि मिली, वह उसके समान थी।


-1

मुझे भी ऐसी ही समस्या का समाधान करना पड़ा था। कारण यह था कि मैं अपने विंडोज बॉक्स में डिफ़ॉल्ट एक की तुलना में एक अलग JRE के साथ JDK का उपयोग कर रहा था।

सही java.exe के उपयोग से मेरी समस्या हल हो गई।


-2

यदि आप ऐसा कर रहे हैं जब एक Xamarin के लिए JAR फ़ाइलों को बाँधने की कोशिश की जा रही है।

JARTOXML: चेतावनी J2XA006: लापता वर्ग त्रुटि को दर्शाते हुए उठाया गया था। com.your.class: मैनिफेस्ट मुख्य विशेषताओं के लिए अमान्य हस्ताक्षर फ़ाइल डाइजेस्ट

बस Winzip का उपयोग करके JAR फाइलें खोलें और मेटा-इन निर्देशिकाओं को हटा दें। पुनर्निर्माण - काम किया


1
यह एक भयानक तकनीक है। बिलकुल भयानक। सुधार स्थानीय स्तर पर आने वाले जार में परिवर्तन न करें
sinisterrook
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.