当前位置:首页 » 《关于电脑》 » 正文

java -jar提示jar中没有主清单属性(no main manifest attribute)

14 人参与  2024年09月22日 15:21  分类 : 《关于电脑》  评论

点击全文阅读


目录

传送门前言排查原因问题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包等等


点击全文阅读


本文链接:http://zhangshiyu.com/post/163126.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1