存在Manifest文件时运行Java jar包仍出现Manifest属性错误
问题原因
- MANIFEST.MF格式不符合规范:MANIFEST.MF要求所有配置行末尾必须包含换行符,即便是最后一行也需要额外加一个空行;如果Main-Class行末尾没有换行,或者行尾存在多余的不可见空格,JVM会无法正确读取到Main-Class配置。
- MANIFEST.MF文件名或路径错误:如果实际jar包内的MANIFEST.MF文件名大小写错误(比如写为Manifest.mf),或者存放路径不在jar包根目录的META-INF文件夹下,都会导致JVM无法读取到配置文件。
- 打包配置错误:如果使用Maven等构建工具打包时,maven-jar-plugin的配置存在冲突,可能会导致你本地修改的MANIFEST.MF被打包工具覆盖,最终生成的jar包内的MANIFEST.MF实际不存在有效Main-Class配置。
- 执行命令逻辑冲突:使用
java -jar参数运行jar包时,JVM会强制读取MANIFEST.MF中的Main-Class属性,命令行末尾追加的主类全限定名会被识别为程序入参,不会生效,虽然这不是触发该报错的直接原因,但会导致后续主类逻辑执行异常。
解决方法
- 第一步:验证jar包内实际的MANIFEST.MF内容
执行如下命令解压出jar包内的MANIFEST.MF文件,确认实际配置:
打开文件检查:Main-Class配置的类全限定名是否和实际类路径一致(注意Java大小写敏感)、行尾是否有多余空格、文件末尾是否有一个空行。# 查看jar包内是否存在MANIFEST.MF jar tf myapp.jar | grep META-INF/MANIFEST.MF # 解压出MANIFEST.MF到当前目录 jar xf myapp.jar META-INF/MANIFEST.MF - 第二步:修复打包配置
如果你使用Maven打包,在pom.xml中添加如下maven-jar-plugin配置,明确指定主类,由工具自动生成符合规范的MANIFEST.MF:
配置后重新执行<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <mainClass>com.avc.apb.printbatch.printfileuploadapplication</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build>mvn clean package打包即可。 - 第三步:修正运行命令
如果你要使用-jar参数运行,直接执行如下命令即可,无需在末尾追加主类名:
如果你不想修改MANIFEST.MF,也可以直接指定classpath运行主类,命令如下:java -jar myapp.jarjava -cp myapp.jar com.avc.apb.printbatch.printfileuploadapplication
内容的提问来源于stack exchange,提问作者Saimuga
相关产品推荐
相关产品推荐

