java 打包后无法运行(签名、依赖冲突或编译配置不一致)
打包后运行 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 attributes
at 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!"
原文地址:https://blog.csdn.net/wolf23151269/article/details/143978825
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!