jar运行报错no main manifest attribute
在服务器上运行:
java -jar test-0.0.1-SNAPSHOT.jar
报错:
no main manifest attribute, in test-0.0.1-SNAPSHOT.jar
原因:
原因是找不到主类。
一般情况下,java 打包成 jar 包需要在 MANIFEST.MF 中指定 Main-Class项,以便运行 java -jar xxx.jar 时找到对应的主类。
将test-0.0.1-SNAPSHOT.jar解压后
查看META-INF下的MANIFEST.MF
而正常的应该是这样的:
解决:
1.检查 maven 项目中的 pom.xml 中有没有缺少如下配置,缺少的话加上
<packaging>jar</packaging>
2.在 pom.xml 中的 build 标签下的 plugins 标签下加入如下打包插件配置
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.0</version>
<configuration>
<mainClass>com.xtool.manager.MainDemo</mainClass>
<finalName>XTool</finalName>
<includes>
<include>
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
说明:
- mainClass 标签里是你的项目的启动类的包路径,如果你的项目没有有启动类也不需要通过 java -jar 运行的话可以删除 mainClass
- finalName 标签里的就是打出来的 jar 名,我这里是 XTool ,最终生成的就是 XTool.jar 。若不使用 finalName 指定,则打包生成的 jar 包名默认使用 pom.xml 文件里 artifactId 标签和 version 标签里的值作为 jar 的名。
- 如果你希望最终生成的 jar 包不包含第三方依赖那直接用上面的插件配置即可。如果希望最终生成的 jar 包里包含第三方依赖那就删除 includes 标签及其里面的内容
3.在 idea 右边侧边栏的 Maven 选项卡里点击 Lifecyle 下的 package 就可以开始打包了
最终生成的 jar 包就在 target 目录下
如果使用这种打包方式问题任然存在,可以尝试使用 idea 来打包,可参考我另一篇文章:idea 项目代码打包为jar包详解