打包后运行 Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributesat java.base/sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:347)at java.base/sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:289)at java.base/java.util.jar.JarVerifier.processEntry(JarVerifier.java:327)at java.base/java.util.jar.JarVerifier.update(JarVerifier.java:239)at java.base/java.util.jar.JarFile.initializeVerifier(JarFile.java:761)at java.base/java.util.jar.JarFile.ensureInitialization(JarFile.java:1037)at java.base/java.util.jar.JavaUtilJarAccessImpl.ensureInitialization(JavaUtilJarAccessImpl.java:72)at java.base/jdk.internal.loader.URLClassPath$JarLoader$2.getManifest(URLClassPath.java:883)at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:848)at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)at java.base/java.lang.Class.forName0(Native Method)at java.base/java.lang.Class.forName(Class.java:467)at java.base/sun.launcher.LauncherHelper.loadMainClass(LauncherHelper.java:800)at java.base/sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:695)
日常踩坑 IDE 正常运行 打包后服务器直接报错 最终无法找到代码修改的具体解决办法
IDE 能正常运行但打包后的 .jar 文件报错,通常是因为在 IDE 环境中,所有依赖和配置都是直接在开发环境加载的。而在打包成 .jar 文件时,可能会遇到签名、依赖冲突或编译配置不一致的问题。
临时解决方法
如果你需要快速验证 .jar 文件是否能正常运行,而不依赖签名的完整性,可以尝试以下方法移除 .jar 中的签名文件:
1. 解压生成的 .jar 文件。
2. 删除 META-INF 文件夹中的 .SF、.DSA 或 .RSA 文件。
3. 重新打包 .jar 文件:
#!/bin/bash# 定义 JAR 文件路径和目标文件夹
JAR_FILE="target/project-*.jar"
TARGET_DIR="test"# 清理旧的打包文件
echo "Cleaning up old JAR files..."
rm -rf target/projecttest.jar# 解压 JAR 文件
echo "Unzipping JAR file..."
unzip -o $JAR_FILE -d $TARGET_DIR# 进入解压后的目录
cd $TARGET_DIR# 删除不需要的签名文件
echo "Removing unnecessary signature files..."
rm -rf META-INF/*.SF
rm -rf META-INF/*.DSA
rm -rf META-INF/*.RSA# 返回上级目录
cd ..# 重新打包 JAR 文件,并生成新的 MANIFEST.MF
echo "Repacking JAR file..."
jar cmvf $TARGET_DIR/META-INF/MANIFEST.MF target/projecttest.jar -C $TARGET_DIR .# 清理解压后的临时文件夹
echo "Cleaning up temporary files..."
rm -rf $TARGET_DIR/*# 打印完成信息
echo "JAR file repackaged successfully!"