问题场景
IDEA执行
mvn clean package -DskipTest=true
命令或者借助工具的Maven菜单
进行打包操作,然后执行java -jar app.jar
命令后,提示jar中没有主清单属性
D:\WorkSpace\demo\target>java -jar demo-SNAPSHOT.jar
demo-SNAPSHOT.jar中没有主清单属性
原因分析
这个错误通常是由于生成的JAR文件缺少一个主清单属性引起的。在使用
java -jar
命令运行JAR文件时,JVM需要查找JAR文件中包含Main-Class
属性的清单文件。如果没有找到这个属性,就会出现该错误。
验证分析
打开Jar包,查看其构建的jar目录,可以看到有一个MANIFEST.MF文件。该文件就是jar运行时要查找的清单目录,其中主清单数据,就是要运行的主类,即main函数入口所在的类
正常情况下,该清单文件内会有一个:
Main-Class:cn.ybzy.demo.mainDemo
解决方案
添加Main-Class
手动创建一个包含
Main-Class
清单属性的MANIFEST.MF
文件,然后将其添加到JAR文件中
打开Jar包,在MANIFEST.MF
文件中,添加Main-Class主类
Main-Class:cn.ybzy.demo.mainDemo
使用插件
1.使用maven-jar-plugin
插件
在pom.xml文件中使用
maven-jar-plugin
插件,并在其中指定了<mainClass>
属性。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.example.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
2.使用maven-shade-plugin
插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.MainClass</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>