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

传送门

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包等等

  • 32
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当使用`java -jar`命令运行一个Maven打包的项目时,出现"no main manifest attribute, in java-***-SNAPSHOT.jar"错误通常是由于缺乏清单属性导致的。 清单属性是用于标识可执行JAR文件的入口点的,它告诉Java虚拟机应该运行哪个类作为程序的起点。在Maven打包过程,如果没有正确配置清单属性,那么在运行JAR文件时会出现此错误。 有几种可能的原因导致这个问题。其一种可能是在创建Spring Boot项目时,自动导入的spring-boot-maven-plugin插件添加了`<skip>true</skip>`标签,导致类被忽略。 要解决这个问题,你可以在pom.xml文件手动配置清单属性。你需要确保在`<build>`标签下的`<plugins>`标签添加了正确的配置,指定了项目的类。例如: ``` <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.example.MyApplication</mainClass> </configuration> </plugin> </plugins> </build> ``` 在上面的配置,`com.example.MyApplication`是你的项目的类。你需要根据你的项目结构和类的包名进行相应的修改。 完成配置后,重新运行Maven打包命令,确保生成的JAR文件包含了正确的清单属性。然后再次尝试用`java -jar`命令运行JAR文件,这个错误应该就会消失了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【Maven】maven生命周期-jar没有清单属性no main manifest attribute, in java](https://blog.csdn.net/forest_long/article/details/129474087)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [java打包maven启动报错jar没有清单属性](https://blog.csdn.net/Xhani/article/details/131243454)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝影铁哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值