文章目录
- 解决jar包中没有主清单目录的问题
- 问题描述
- 环境描述
- 方法一 | 阿里巴巴构造器的通用解决方案
- 方式二 | 指定MANIFEST.MF路径
解决jar包中没有主清单目录的问题
问题描述
很简单可能很多人都遇到过,maven项目打成jar包后执行报错:jar包中没有主清单属性
报错如下:
D:\Dev\DevTools\jdk8\bin\java.exe -Dfile.encoding=GBK -jar D:\DevCodes\Gitlab\TempDemo\target\TempDemo-0.0.1-SNAPSHOT.jar
D:\DevCodes\Gitlab\TempDemo\target\TempDemo-0.0.1-SNAPSHOT.jar中没有主清单属性
截图如下:
环境描述
由于现在SpringBoot官方提供的Spring Initializr不提供2.x.x版本的SpringBoot,所以我将它替换成了阿里的构造器(替换方法见下图,URL:
https://start.aliyun.com
)。
这一步不是步骤,不需要模仿。
方法一 | 阿里巴巴构造器的通用解决方案
无论是否使用阿里巴巴构造器创建的项目,都需要确认pom.xml文件中是包含下面代码,如果有的话请注释掉
<skip>true</skip>
这一行代码,随后打包测试。
若是采用我在上面介绍的阿里巴巴构造器的项目创建方式,则一定会遇到这个问题,且这种方式一定可以解决。
<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.jim.tempdemo.TempDemoApplication</mainClass><!-- 需要注释掉的代码 --><!-- <skip>true</skip> --></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions>
</plugin>
注释掉之后重新打包即可。
注意:请勿修改build
标签中的其它代码,可能会导致打包后依然没有主清单属性,如果修改请还原。
注意:使用阿里构造器创建的项目请勿删除dependencyManagement
,这会一些依赖无法下载,需要手动指定版本或指定项目的父项目(parent)。
方式二 | 指定MANIFEST.MF路径
此方案适用于官方构造器创建的项目,若是采用阿里巴巴构造器创建的项目使用此方案解决的话,需要对POM进行改造,在文章末尾有介绍。
-
点击
Project Structure
-
按照下图依次创建一个Artifacts
请注意:上图第二个红框框中的路径一开始不是src下,需要修改一下。
做完上述步骤后,src文件夹下会出现一个META-INF
文件夹,里面的文件中包含着启动类等信息。
到这里就可以再次尝试打包了(官方构造器创建的项目到这里应该已经解决了),如果还没有解决问题,请继续往下看。
- 如果还没有解决问题的话,请在你的pom.xml文件中添加maven插件:
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>
添加后刷新Maven后重新打包测试。
正如上文所说,方式2并不适用于阿里巴巴构造器,如果是使用阿里巴巴构造器创建的项目想要使用方式2来解决的话,需要删除掉
dependencyManagement
标签,随后刷新Maven会提示几个依赖没有版本信息,这时候给这几个缺失版本的依赖都添加上依赖信息后重新打包即可,或者不用单独指定依赖版本,直接指定整个项目的父项目也可以。