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

news2024/11/25 1:06:01

目录

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1669777.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

woffice– 内部网和外部网WordPress高端资讯主题

下载地址&#xff1a;https://m.gx.cn/site/3046.html 完全灵活&#xff0c;与最新的WordPress品牌兼容 翻译语言超过15种 使用最新技术设计快速web应用程序 所有这些都以谷歌材料设计为灵感&#xff0c;采用易于定制的设计&#xff0c;给人一种优美的现代感和易于导航的用户…

HCIE学习笔记----OSPF详解

OSPF邻居建立的条件 OSPF建立邻居“41”条件总结 4个一致 一个不一致 1.保证接口的前缀 网络信息一致 2.保证ospf区域号和区域类型一致 3.hello包间隔时间和死亡时间一致 4.认证类型和认证认证信息一致 5.路由器的ID不一致 保证唯一性 一-----OSPF 邻接关系建立过程与状…

文字转语音服务的技术

文字转语音&#xff08;Text-to-Speech, TTS&#xff09;技术允许将书面文本转换为口语化的语音。以下是一些提供文字转语音服务的调用接口&#xff0c;开发者在选择文字转语音服务时&#xff0c;应考虑支持的语言、声音类型、音频格式、服务稳定性以及是否支持特定功能&#x…

spring框架定时任务(@Scheduled)

内容&#xff1a; 在spring框架中&#xff0c;scheduled注解是用于声明定时任务的&#xff0c;以最简单的方式来创建定时任务。 注意&#xff1a; 要使用scheduled注解&#xff0c;需要确保已下几点&#xff1a; 1.spring应用程序已经开启了定时任务的开启。需要在配置类&am…

【JavaWeb】网上蛋糕商城后台-客户管理

概念 上文中已讲解和实现了后台管理系统中的订单管理功能&#xff0c;本文讲解客户信息管理功能。 客户信息列表 在后台管理系统的head.jsp头部页面中点击“客户管理”向服务器发送请求 在servlet包中创建AdminUserListServlet类接收浏览器的请求 package servlet;import m…

FebHost:什么是新西兰.NZ域名?

.nz域名是新西兰的顶级域名&#xff08;TLD&#xff09;。它是专门分配给新西兰的国家代码顶级域&#xff08;ccTLD&#xff09;。以 .nz 结尾的域名用于标识与新西兰或其居民相关的网站、电子邮件地址和其他在线资源。 .nz 域名由新西兰域名委员会管理。负责监督 .nz 域名的注…

驱动丹佛斯比例电磁铁放大器

驱动丹佛斯比例电磁铁是一种用于实现对液压系统连续且精确控制的通电带磁性装置。比例阀由直流比例电磁铁和液压阀两部分组成。其中&#xff0c;比例电磁铁是其核心部件&#xff0c;负责将输入的电信号转换成力和位移输出&#xff0c;从而控制液压阀的工作状态。比例电磁铁通过…

啥是PLCnext?它能干啥?

PLCnext控制器 简单来说&#xff0c;PLCnext是基于Linux操作系统的一个控制器运行时&#xff0c;所以它原生具备的两个特点&#xff1a; 1.原生兼容IEC61131 2.原生兼容Linux各类应用 PLCnext的控制器大概长下面这样&#xff08;AXC F 1152、2152&#xff09;&#xff0c;通…

在全志H616核桃派开发板上进行PyQt5的代码编写和运行

核桃派本地 在上一节我们通过Qt Designer设计了ui窗口并转换成了Python代码&#xff0c;由于是Python编程&#xff0c;因此我们可以在核桃派开发板打开Python代码进行编程。 在核桃派上推荐使用Thonny来打开编写Python文件, 使用请参考&#xff1a;Thonny IDE。 打开上一节生…

每天认识新职业——网络工程师

一、网络工程师是什么 网络工程师是通过学习和训练&#xff0c;掌握网络技术的理论知识和操作技能的网络技术人员。网络工程师能够从事计算机信息系统的设计、建设、运行和维护工作。相关职业&#xff1a;系统集成工程师、计算机硬件工程师职业其他名称&#xff1a;网络管理员、…

TriCore: 从RTOS内核的角度看CSA

今天尝试从RTOS内核的角度来看看 TriCore 的 CSA。 CSA的细节信息可以参考前一篇文章 TriCore User Manual 笔记 1-CSDN博客 CSA 的全称是 Context Save Area&#xff0c;顾名思义就是专门用来保存上下文的一块存储区域。 既然是上下文使用&#xff0c;那必然要求低延迟&…

VS小知识----qDebug打印中文时乱码

问题&#xff1a;vs在打印中文时乱码 分析解决&#xff1a;编码问题&#xff0c;改为UTF-8试试

2024最新独立版校园跑腿校园社区小程序源码+附教程 适合跑腿,外卖,表白,二手,快递等校园服务

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 后台php&#xff0c;前端uniapp可以二次开 2024最新独立版校园跑腿校园社区小程序源码附教程 测试环境&#xff1a;NginxPHP7.2MySQL5.6 多校版本&#xff0c;多模块&#xff0c;适…

银河麒麟服务器sshd启动失败,报错(code=exited, status=255/EXCEPTION)

服务器版本&#xff0c;银河麒麟高级服务器操作系统V10-SP3 查看sshd服务状态systemctl status sshd&#xff0c;报错(codeexited, status255/EXCEPTION) 查看日志journalctl -xe&#xff0c;没有得到太多有用信息。 尝试卸载ssh服务&#xff0c;并重装&#xff1a; yum r…

螺杆式冷水机的回油问题

螺杆式冷水机出现冷冻油回油不畅是非常让人头痛的事情&#xff0c;一般来说&#xff0c;螺杆式冷水机回油不畅的原因主要是因为在运行过程中&#xff0c;出现冷冻油与制冷剂的气体混合物现象。具体是&#xff0c;在制冷系统的运行中&#xff0c;遇到制冷剂与冷冻机润滑油互溶会…

Kubernetes-容器的生命周期(init容器、健康检查探针、钩子)

目录 一、概述 二、init容器 1.概述 2.init容器作用 3.InitC容器示例 三、容器探针 1.概述 2.探针类型 3.readinessProbe-就绪检测示例 4.livenessProbe-存活检测示例 5.livenessProbe-tcp--检测端口模板 四、钩子 1.概述 2.yaml模板 3.示例 一、概述 1.当一个p…

GO+树莓派+E53_IA1智慧农业模块

简介 之前手头上有小熊派的开发板&#xff0c; 有一个E53_IA1模块&#xff0c; 刚好用到树莓派上&#xff0c; 使用GO进行控制&#xff0c;实现智慧农业模块功能。 模块介绍 模块电路介绍 按硬件分成五块&#xff0c; 其中四块在本次用上了&#xff0c; 分别是 1. 补光模块&…

C语言 | Leetcode C语言题解之第80题删除有序数组中的重复项II

题目&#xff1a; 题解&#xff1a; int removeDuplicates(int* nums, int numsSize) {if (numsSize < 2) {return numsSize;}int slow 2, fast 2;while (fast < numsSize) {if (nums[slow - 2] ! nums[fast]) {nums[slow] nums[fast];slow;}fast;}return slow; }

如何利用代理IP高效采集全球热点,赋能短视频创作?

如何利用代理IP高效采集全球热点&#xff0c;赋能短视频创作&#xff1f; 一、摘要二、代理IP1. 什么是代理IP&#xff1f;2. 代理IP的分类3. 代理的重要性 三、如何选择可靠的代理IP服务商&#xff1f;四、IPIDEA代理IP简介1.IPIDEA简介2.IPIDEA的优势 五、获取代理IP1. 注册平…

【数据结构】折半查找/二分查找 查找判定树+效率分析+完整代码

2.2 折半查找 算法思想 定义&#xff1a; 折半查找&#xff0c;又称二分查找&#xff0c;仅用于有序的顺序表。 实现思路&#xff1a; 1.设置low和high指针&#xff0c;分别在序列首尾&#xff1b; 2.取中间位置mid(lowhigh)/2&#xff1b; 3.若mid所指元素大&#xff0c;则去…