目录
- 传送门
- 前言
- 排查原因
- 问题1-》jdk17和jdk8共存导致idea的maven插件识别报错
- 问题2-》pom.xml中mainClass下面的skip属性是罪魁祸首
- 其他办法(修改jar包)
传送门
SpringMVC的源码解析(精品)
Spring6的源码解析(精品)
SpringBoot3框架(精品)
MyBatis框架(精品)
MyBatis-Plus
SpringDataJPA
SpringCloudNetflix
SpringCloudAlibaba(精品)
Shiro
SpringSecurity
java的LOG日志框架
Activiti(敬请期待)
JDK8新特性
JDK9新特性
JDK10新特性
JDK11新特性
JDK12新特性
JDK13新特性
JDK14新特性
JDK15新特性
JDK16新特性
JDK17新特性
JDK18新特性
JDK19新特性
JDK20新特性
JDK21新特性
其他技术文章传送门入口
前言
JDK17环境,并且用了最新版idea,打包一个jar包,在window系统中java -jar xx.jar的时候,居然报没有主清单属性错误,在Linux系统中报no main manifest attribute, in xx.jar
排查原因
问题1-》jdk17和jdk8共存导致idea的maven插件识别报错
虽然已经把jdk17在window环境中设置成默认了,但是电脑中同时安装了jdk17和jdk8,window电脑中系统环境变量中JAVA_HOME已经配置指向了jdk17了,那么jdk17就是默认的了。但是idea创建一个新的SpringBoot项目的时候,可不这么认为。
作者新创建了一个SpringBoot项目,果然pom.xml文件中plugin默认是jdk1.8去编译java源文件,这个虽然不是导致“提示jar中没有主清单属性”的罪魁祸首,但是最好纠正。
还有就是点击项目,比如鼠标点击feBackEnd,再按F4,将Project和Modules两个选项都设置成jdk17的。
不然有的可能默认是jdk8,不去纠正,运行jar包会有莫名其妙的问题,而且jdk9-jdk17的新特性也会失效。
问题2-》pom.xml中mainClass下面的skip属性是罪魁祸首
mainClass这些属性,主要是指明主清单,也就是程序的主入口;
结果还有个skip属性,idea默认创建SpringBoot属实坑爹,这个skip让设置的注清单跳过了,
这直接导致了运行jar包找不到程序主入口,就提示了“jar中没有主清单属性”。
坑啊。。。
纠正方式1-》skip属性设置成fasle
纠正方式2-》skip属性这行去掉
纠正方式3-》原来没有mainClass这个配置的要加上
如果你的idea给你创建的SpringBoot有mainClass这个plugin插件的配置,那么要保留下来,按照上面的两种方式纠正了就可以了。其实在jdk8的环境下,idea创建SpringBoot2项目的时候,是没有这个plugin插件配置的,在jdk17环境下,idea创建SpringBoot3版本的项目的时候,默认是会带出这个plugin插件配置的。
如果你的idea给你创建的SpringBoot默认没有mainClass这个plugin插件的配置,而你启动又提示了““jar中没有主清单属性”,那么就可以加上这个配置。
最后,正确的配置如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source>
<target>17</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.zt.project.FeBackEndApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
注意:一定不要忘记F4去设置项目里面的jdk环境变更为jdk17,有些默认还是jdk8。如果你的电脑还有更多的jdk其他版本,那么设置idea的时候更要小心,可能就不止项目这块设置了,整个idea的设置也最好检查一下。
其他办法(修改jar包)
如果不方便拿到源码重新编辑处理,那么可以通过修改打好的jar包来解决问题。
这个是作者的一个jar包,推荐360压缩去打开,Windows自带的WinRAR实在不给力,有时候识别不出来,而360压缩是个神器工具。
打开jar包后进入META-INF文件夹
打开MANIFEST.MF这个文件(右键用记事本打开)
这个是作者默认的内容,你们的和这个可能不太一样,影响不大,原理一样。
然后加上一句话:
Main-Class: com.zt.project.FeBackEndApplication
保存修改好的文件。其实就是修改jar包告诉程序入口是哪里,注意Main-Class后面写全类名。
主程序的全类名很好推测,有了jar包,文件目录就是全类名。
顺利的话,就搞定了。
当然如果还报错的话,就是其他错误了,比如作者下面这种错误:
是因为作者的启动类里面写了其他日志调用
这种还是继续修改MANIFEST.MF文件
Manifest-Version: 1.0
Created-By: Maven JAR Plugin 3.3.0
Build-Jdk-Spec: 17
Main-Class: org.springframework.boot.loader.launch.JarLauncher
Start-Class: com.zt.project.FeBackEndApplication
Spring-Boot-Version: 3.2.2
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
注意:
- Spring-Boot-Version我这边是3.2.2版本
- Build-Jdk-Spec: 17 我这边jdk是17
- Created-By: Maven JAR Plugin 3.3.0 都用原来的
- Manifest-Version: 1.0 版本号等 上面的最好都是采取你们原来的版本号
- 还有个BOOT-INF文件夹在jar包中一定会有,如果没有,那么pom.xml根本没有设置对,只能重新回去打包
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
这个pom.xml中的plugin插件,就是打jar包中,产生了BOOT-INF文件夹,该文件夹里面有依赖的其他jar包等等