命令行运行生成的jar包,报错
leung@wuyujin simple-webservice-server % java -jar target/sample-1.0-SNAPSHOT.jar 7896
target/sample-1.0-SNAPSHOT.jar中没有主清单属性
或 no main manifest attribute, in target/sample-1.0-SNAPSHOT.jar
错误原因:打包后的jar包中没有manifest
文件,该文件有两行配置,关于jar包的启动类的全路径
解决
手动修复
只要手动编辑打包后jar包中的 META-INF/
目录下的 MANIFEST.MF
文件即可。
修改打包规则 一劳永逸
你一定不想每次打包后,都手动修改一些文本的配置文件吧。
那就把这些规则打包后的启动类
写在pom.xml中,maven 的 plugin 配置中。
- 加maven plugin
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.coffee.bee.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
配置位置:
plugins 下
pluginManagement > plugins 下
之后每次打包都会自动将启动类的全路径写入 METAINF/MANIFEST.MF
文件。
MANIFEST.MF demo
某个应用,某次package后的MANIFEST.MF
Others
本问题是典型的由环境迁移导致的程序运行(启动)出错。
不知道你会不会有疑问:
我在本地使用IDE开发时,也没有做这些配置。但是程序是OK的。
WHY?
manifest.mf 文件中的启动类是jar包运行的前置条件,所以这一步一定要做。
开发时我们没做,只是因为IDE作为集成工具,自动帮我们完成了这一步
。
IDEA 中关于 main class 的配置
编辑应用运行的配置 Edit Configurations
填写主类Main class
(这一步也可以下拉选择类)
甚至那你需要在这里设置。
当run过某个含main的类之后,IDEA会自动将该类初始化到 main class 的配置项。