目录
传送门前言排查原因问题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.0Created-By: Maven JAR Plugin 3.3.0Build-Jdk-Spec: 17Main-Class: org.springframework.boot.loader.launch.JarLauncherStart-Class: com.zt.project.FeBackEndApplicationSpring-Boot-Version: 3.2.2Spring-Boot-Classes: BOOT-INF/classes/Spring-Boot-Lib: BOOT-INF/lib/Spring-Boot-Classpath-Index: BOOT-INF/classpath.idxSpring-Boot-Layers-Index: BOOT-INF/layers.idx注意:
Spring-Boot-Version我这边是3.2.2版本Build-Jdk-Spec: 17 我这边jdk是17Created-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包等等