一、什么是maven打包没有主清单属性
每一个Java程序在加载时都需要一个清单文件(manifest),用于描述打包文件的一些基本信息。而这个清单文件被命名为主清单文件(META-INF/MANIFEST.MF),是Java世界中非常重要的一个文件。一般情况下,当我们使用maven构建Java项目时,maven会默认自动生成这个主清单文件。但是有时候在打包时,会遇到没有主清单属性的问题。
二、为什么会出现没有主清单属性的问题
通常,maven使用maven-jar-plugin这个插件来打包项目,生成Jar文件,maven-jar-plugin指定了META-INF/MANIFEST.MF这个清单文件的存放位置,但是当没有自定义的配置不当或该文件被意外删除时,maven就会生成不带主清单属性的jar包,也就是不存在"Manifest-Version"这一属性。
三、如何解决没有主清单属性的问题
解决没有主清单属性的问题有以下几种方式:
1、更新maven-jar-plugin插件的版本
由于maven-jar-plugin插件的版本不同,它的默认行为也不同。一些较新版本的插件,例如3.0.0以上的版本,会自动添加指定的清单属性,当然,我们也可以在pom.xml文件中指定maven-jar-plugin插件的配置参数,如下所示:
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
...
</project>
2、在maven的pom.xml中添加自定义的清单文件
手动创建一个MANIFEST.MF文件,文件内容需以"Manifest-Version: 1.0"开头,然后手动添加到pom.xml文件中的配置中。如下所示:
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifest>
<!-- 添加自己的清单属性 -->
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
<!-- 指定自定义的清单 -->
<manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
...
</project>
3、手动指定清单属性
如果只想指定Manifest-Version这一属性而不是添加实现信息,可以直接在maven-jar-plugin插件的配置中指定,如下所示:
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifestEntries>
<Manifest-Version>1.0</Manifest-Version>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
...
</project>
四、总结
在maven进行Java项目打包时,遇到没有主清单属性的问题时,主要有三种解决方式,分别是更新maven-jar-plugin插件的版本、在maven的pom.xml中添加自定义的清单文件、手动指定清单属性。通过本文的介绍,相信读者已经对maven打包没有主清单属性的问题有了一个清晰的认识,可以灵活应对这个问题了。