2016-01-18 9 views
13

私のプロジェクトのjarファイルを実行しようとしています。私はintelliJで作業しており、jarファイルを生成するためにアーティファクトを使用しています。しかし、毎回、私のjarファイルを実行しようとしているので、例外が出てきます。jarファイルを実行しようとしたときにマニフェスト主属性のシグネチャファイルダイジェストが無効です

java.lang.SecurityException: Invalid signature file digest for Manifest main attributes 
    at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:284) 
    at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:238) 
    at java.util.jar.JarVerifier.processEntry(JarVerifier.java:316) 
    at java.util.jar.JarVerifier.update(JarVerifier.java:228) 
    at java.util.jar.JarFile.initializeVerifier(JarFile.java:383) 
    at java.util.jar.JarFile.getInputStream(JarFile.java:450) 
    at sun.misc.JarIndex.getJarIndex(JarIndex.java:137) 
    at sun.misc.URLClassPath$JarLoader$1.run(URLClassPath.java:839) 
    at sun.misc.URLClassPath$JarLoader$1.run(URLClassPath.java:831) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.misc.URLClassPath$JarLoader.ensureOpen(URLClassPath.java:830) 
    at sun.misc.URLClassPath$JarLoader.<init>(URLClassPath.java:803) 
    at sun.misc.URLClassPath$3.run(URLClassPath.java:530) 
    at sun.misc.URLClassPath$3.run(URLClassPath.java:520) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.misc.URLClassPath.getLoader(URLClassPath.java:519) 
    at sun.misc.URLClassPath.getLoader(URLClassPath.java:492) 
    at sun.misc.URLClassPath.getNextLoader(URLClassPath.java:457) 
    at sun.misc.URLClassPath.getResource(URLClassPath.java:211) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:365) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495) 
Error: A JNI error has occurred, please check your installation and try again 
Exception in thread "main" 

そして、これは私のマニフェストファイルです。

Manifest-Version: 1.0 
Main-Class: Main 

その後、外部ライブラリは私が間違って何をやっている私のプロジェクトに

enter image description here

を追加しました?

更新

enter image description here

+0

JARの内容は何ですか?JARを開いてそのコンテンツのスクリーンショットを投稿できますか? – hagrawal

+0

質問を更新しました....チェック@hagrawal – Fay007

+0

@ Fay007こんにちは!あなたはいくつかの解決策を見つけましたか、私も同じ問題を抱えていました。私は多くを探し、良い解決策を見つけることはできませんでした。ありがとう! –

答えて

22

あなたの依存JARファイルの一部を使用すると、1つのJARに、すべてを組み合わせて、そのJARを実行するときに、次に署名したJARの署名がアップし、したがって、一致していない、署名付きJARあり署名の不一致に関するセキュリティ例外が発生します。

これを修正するには、最初にすべての依存関係JARが署名されたJARを特定してから除外する必要があります。 MAVENとANTのどちらを使用しているかによって、適切な解決策を講じなければなりません。以下は、herehere、およびhereです。

のMaven:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <version>2.6</version> 
    <executions> 
     <execution> 
      <id>unpack-dependencies</id> 
      <phase>package</phase> 
      <goals> 
       <goal>unpack-dependencies</goal> 
      </goals> 
      <configuration> 
       <excludeScope>system</excludeScope> 
       <excludes>META-INF/*.SF</excludes> 
       <excludes>META-INF/*.DSA</excludes> 
       <excludes>META-INF/*.RSA</excludes> 
       <excludeGroupIds>junit,org.mockito,org.hamcrest</excludeGroupIds> 
       <outputDirectory>${project.build.directory}/classes</outputDirectory> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

ANT:

<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> 


OPさんのコメントに基づいて更新:

"sqljdbc4.jar"はOPの外部ライブラリの署名付きJARでした。したがって、上記のように、.SF、.RSA、.DESなどのシグネチャ関連ファイルや他のアルゴリズムファイルを体系的に除外することは、前進する正しい方法です。

これらの署名ファイルが除外されない場合、署名の不一致によりセキュリティ例外が発生します。

JARに署名があるかどうかを確認する方法: JARに.SF、.RSA、.DESなどのファイルやその他のアルゴリズムファイルなどのファイルが含まれている場合は、署名付きJARです。

+0

私のプロジェクトのようなファイルはありません – Fay007

+0

これは最も役に立つ回答/アドバイスのようです –

+0

私の人生を保存していただきありがとうございます – Sayka

0

META-INFファイルを削除する代わりに、アーティファクト定義のメソッドを変更しました。私はArtifactから "抽出された"ライブラリを削除し、 "Put Output Root"として再度追加しました。

この方法では、ライブラリには、私もsqljdbc.jarを使用しています、ところで...私は図書館に署名の目的であると仮定し、新しいjarファイルの変更、なし

を組み込むことになります。

関連する問題