Недопустимый дайджест файла подписи для исключения основных атрибутов манифеста при попытке запустить файл jar

Я пытаюсь запустить файл 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

Затем внешние библиотеки добавлены в мой проект

enter image description here

Что я делаю не так??

Обновить

enter image description here

Ответ 1

Некоторые из ваших JAR-зависимостей JAR - это подписанный JAR, поэтому, когда вы объединяете все в одном JAR и запускаете JAR, подпись подписи JAR не совпадает и, следовательно, вы получаете исключение безопасности из-за несоответствия подписи.

Чтобы исправить это, вам нужно сначала определить, какие все JAR с зависимостями подписаны JAR, а затем исключить их. В зависимости от того, используете ли вы MAVEN или ANT, вы должны принять соответствующее решение. Ниже вы можете прочитать здесь, здесь и здесь.

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>

МУРАВЕЙ:

<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" был подписанным JAR в внешних библиотеках OP. Таким образом, следующий выше подход к систематическому исключению файлов, связанных с сигнатурой, таких как.SF,.RSA или.DES или другие файлы алгоритмов, является правильным способом продвижения вперед.

Если эти файлы сигнатур не исключены, исключение безопасности будет происходить из-за несоответствия подписи.

Как узнать, подписан ли JAR?: если JAR содержит файлы, такие как файлы.SF,.RSA или.DES или другие файлы алгоритмов, то это подписанный JAR.

Ответ 2

Вместо удаления файла META-INF я изменил метод в определении Artifact. Я удалил библиотеку "Извлеченные" из артефакта и добавил ее снова как "Put into Output Root".

Таким образом, библиотека будет включена без каких-либо изменений в новом файле jar, который, я полагаю, является целью подписания библиотеки...

Кстати, я также использую sqljdbc.jar.