1. ホーム
  2. java

[解決済み] jarファイルを実行しようとすると、マニフェストの主属性に対する無効な署名ファイルのダイジェストで例外が発生する

2022-02-02 12:39:31

質問

私のプロジェクトのjarファイルを実行しようとしています。私はintelliJで作業しており、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

そして、プロジェクトに追加された外部ライブラリ

私は何を間違えているのでしょうか?

アップデート

解決方法は?

依存関係にあるJARのいくつかは署名付きJARです。そのため、すべてを1つのJARに結合してそのJARを実行すると、署名付きJARの署名が一致しないため、署名の不一致に関するセキュリティ例外が発生します。

これを解決するには、まず、依存関係にあるすべてのJARが署名付きJARであることを確認し、それらを除外する必要があります。MAVENとANTのどちらを使用しているかによって、適切な解決策を取らなければなりません。以下はその例ですが、もっと読むことができます。 こちら , こちら そして こちら .

メイヴン

<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,META-INF/*.DSA,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です。 または、以下を実行します。 jarsigner -verify jarname.jar と出力されるかどうか確認してください。