解决no main manifest attribute错误
文章目录
- 0. 背景
- 1. java程序如何运行
- 2. jar是什么
- 3. java -jar test-1.0-SNAPSHOT.jar:
- 4. 添加执行入口
0. 背景
在开发Spring boot项目的时候,有时候会需要使用java -jar test-1.0-SNAPSHOT.jar指令来运行开发的java应用,但是很不幸,会遇到这样的错误
no main manifest attribute, in test-1.0-SNAPSHOT.jar
为什么会产生这样的错误呢?如何解决呢?
1. java程序如何运行
在接触java开发的第一天,我们就知道,在编写完Java程序之后
public class Hello { public static void main(String[] args) { System.out.println("Hello World"); }
}
需要使用指令将.java文件编译成class文件
javac Hello.java
然后就可以使用命令就可以执行这个Java程序
java Hello
Hello World
程序运行的入口是main方法,当我们使用java Hello命令,虚拟机就可以根据Hello.class文件中的main方法,来运行程序。但是使用的 java -jar 指令是如何使程序运行起来的呢?
2. jar是什么
JAR(Java Archive)文件是一种打包文件格式,它允许你将多个 Java 类文件、相关的元数据和资源(如文本、图片等)打包到一个单一的文件中,以便于分发和部署。
JAR中包含了类文件,元数据和资源。类文件和资源文件很清楚,那元数据是什么呢?
元数据主要指的是清单文件(MANIFEST.MF) ,这是一个可选文件,用来提供关于jar文件的额外信息。清单文件的主要功能:
-
- 指定主类:在清单文件中,可以指定包含main方法的类,这是Java应用程序的入口点。这允许用户通过java -jar命令直接运行JAR文件。
-
- 定义属性:清单文件可以包含属性,这些属性可以是键值对的形式,用于存储关于JAR文件的额外信息,比如版本号、作者信息等。
-
- 指定类路径:在清单文件中可以定义类路径(Class-Path)属性,指定在运行JAR文件时需要包含的其他JAR文件或目录。
-
- 安全设置:清单文件可以包含安全相关的设置,比如指定需要哪些权限。
-
- 扩展名映射:可以定义文件扩展名到类名的映射,这样当运行具有特定扩展名的文件时,JAR文件中的特定类将被用来处理这些文件。
-
- 其他自定义信息:开发者可以根据需要在清单文件中添加自定义的元数据。
这里可以解压一个jar来看一下:
这里解压一下spring-core-5.3.27.jar来看一下,jar中有什么内容:

这里可以看到,org目录下,放的就是类文件,META-INF放的就是资源文件:

这里再看一下MANIFEST. MF里的内容
Manifest-Version: 1.0
Implementation-Title: spring-core
Automatic-Module-Name: spring.core
Implementation-Version: 5.3.27
Created-By: 1.8.0_345 (Oracle Corporation)
Dependencies: jdk.unsupported
Manifest-Version 表示清单文件的版本。
Created-By 表示创建JAR文件的Java版本和提供者。
Permissions 指定了JAR文件的权限。
这个文件中没有包含指定main的方法,一般这样添加:
Main-Class: com.example.MainApp
3. java -jar test-1.0-SNAPSHOT.jar:
这样已经可以知道,java -jar就是去找指定jar包里的main方法来执行,如何找main方法?根据MANIFEST.MF中的Main-Class类来找。
遇到的错误是没有no main manifest attribute,那就打开看一下。
Manifest-Version: 1.0
Implementation-Title: test
Implementation-Version: 1.0-SNAPSHOT
Build-Jdk-Spec: 1.8
Created-By: Maven JAR Plugin 3.2.2
这里没有这个main attribute,那如何添加这个attribute呢?
以上面的Hello.java为例,来手动打一个jar包。先编写这个MANIFEST. MF
Manifest-Version: 1.0
Build-Jdk-Spec: 1.8
Main-Class: Hello
这样再使用这个文件打一个jar包:
jar cvfm test-hello.jar MANIFEST.MF .
这里的参数作用是
- c:创建新的 JAR 文件。
- v:在打包过程中显示详细输出。
- f:后面跟着的是要创建的 JAR 文件的名称。
- m:指定清单文件的名称。
这个时候就可以使用java -jar愉快的玩耍了。
那上面Springboot程序如何添加这个程序执行入口呢?
4. 添加执行入口
这里的程序打包是使用的maven,那就使用maven的插件来完成就好了!
在pom文件中添加如下插件:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId><executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
这个时候,再使用mvn package指令,就可以得到一个可以正确执行的jar包了。直接java -jar test-1.0-SNAPSHOT.jar愉快玩耍。
相关文章:
解决no main manifest attribute错误
文章目录 0. 背景1. java程序如何运行2. jar是什么3. java -jar test-1.0-SNAPSHOT.jar:4. 添加执行入口 0. 背景 在开发Spring boot项目的时候,有时候会需要使用java -jar test-1.0-SNAPSHOT.jar指令来运行开发的java应用,但是很不幸&#…...
002 | 常见的金融量化指标计算
金融量化指标 在金融量化分析中,常用的指标可以帮助我们判断市场走势、评估风险和收益,以及构建交易策略。以下是一些常见的金融量化指标及其计算方法的详细教程,包括公式与Python代码实现。 1. 移动平均线(Moving Average, MA&…...
Web Vitals:提升用户体验的关键指标
Web Vitals 是 Google 提出的一套核心网页性能指标,旨在帮助开发者理解和优化网站的用户体验。这些指标分为核心 Web Vitals 和附加 Web Vitals,涵盖了加载性能、交互性和视觉稳定性三个方面。以下是详细的介绍和如何使用 Web Vitals 来优化你的网站。 …...
c#中的约束、TimeSpan、defult、operator
c#中的约束 在C#中,约束(Constraints)用于限制泛型类型参数的类型,以确保泛型类型或方法在编译时能够满足特定的要求。约束允许开发者指定泛型类型参数必须满足的条件,比如实现特定的接口或继承自特定的类。以下是一些…...
挖矿木马攻破了服务器
最近被国外的挖矿木马攻破了服务器 根据非法登录,用 #last指令查看登录ip 首先删掉登录主机 #kill -9 pts/0 第二步 #top 看看什么占用cpu高 第三步杀死狂刷CPU的服务 过一分钟后,服务又开始狂刷cpu。 第四步根据pid查到服务地址 #systemctl status…...
从容应对技术面试:策略、技巧与成功案例
欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: 工💗重💗hao💗:野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、应用领域等内容。 ⭐…...
Spring Boot 整合 RestTemplate:详解与实战
Spring Boot 整合 RestTemplate:详解与实战指南 一、引言二、依赖添加Maven 示例:Gradle 示例: 三、创建 RestTemplate 实例四、使用 RestTemplate 发起请求五、处理响应六、高级用法1. 自定义 RestTemplate 实例2. 文件上传、下载以及常见的…...
【利用模板模式和责任链模式实现数据校验】
利用模板模式和责任链模式实现数据校验 一、业务背景二、模板模式和责任链模式代码实现1、数据校验抽象处理器ValidateHandler2、数据校验责任链工具类ValidateChainUtil3、网元调整数据校验抽象类AbstractNodeCheckHandler4、依次定义3个责任链handler,通过Order注…...
学习笔记第十九天
1.标准I/O的基本概念 标准输入(stdin):默认是指键盘输入。 标准输出(stdout):默认是指显示器输出。 标准错误(stderr):用于输出错误信息,也是指向显示器&…...
设计模式 - 单例模式
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、单例模…...
fastapi之WebSockets
文章目录 WebSockets基本概念FastAPI 中的 WebSocket 支持WebSocket 应用示例示例 1: 简单的 WebSocket 连接解释 示例 2: 广播消息的 WebSocket 实现解释 客户端代码示例 完整示例项目结构服务器端代码 (main.py)解释 简单的前端客户端 (static/index.html)解释 测试 相关代码…...
Kotlin 和 Java区别
Kotlin 和 Java 是两种主要用于 Android 开发的编程语言,它们之间有一些关键的区别: 1. 语法简洁性: Kotlin:具有更简洁的语法,减少了冗余代码。例如,Kotlin 支持类型推断,避免了大量的样板…...
windows 达梦到ORACLE dblink
达梦通过DBLINK访问Oracle数据库有两种: 方式一:通过Oracle oci接口; 方式二:一种是通过ODBC数据源的方式。 本案例选择使用Oralce OCI的方式去访问Oracle数据库。 配置Oracle OCI客户端 下载地址:https://www.oracle.com/database/techno…...
大数据应用组件
1、数据存储1.1、hive->hdfs、mapredus1.2、ClickHouse1.3、Elasticsearch1.4、PostgreSQL1.5、HBase 2、数据抽取2.1、Kettle2.2、DataX2.3、Canal2.4、Flink CDC2.5、Sqoop2.6、Filebeat&Logstash(日志) 3、任务编排3.1、Apache DolphinScheduler 4、数据处理4.1、spa…...
Docker Remote API未授权访问漏洞
9.Docker Remote API未授权访问漏洞 步骤一:使用以下Fofa语句对Docker产品进行搜索. port"2375" 步骤二:直接使用浏览器访问以下路径 /version#查看版本信息 /info#查看容器信息 漏洞修复 1.端口访问控制 对2375端口做网络访问控制,如设置iptables…...
算法训练.
一.扩散 题解: 计算点之间的距离,然后对图进行处理即可,这个数据规模较小,因此我使用了floyd,还有最小生成树和二份答案加并查集的写法; 代码: #include <iostream> #include <cstring> #in…...
08、MySQL-事务
目录 1、事务简介 2、事务操作 2.1 方式一 2.2 方式二 3、事务四大特性 4、并发事务问题 5、事务隔离级别 1、事务简介 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,…...
2024 年的 Node.js 生态系统
数据来源于 Node.js Toolbox,网站展示了 Node.js 生态系统中积极维护且流行的库。...
LVS(Linux Virtual Server)
简介 LVS(Linux Virtual Server)是一个高性能的开源负载均衡解决方案,它通过在Linux内核中实现IPVS(IP Virtual Server)模块来提供负载均衡功能。LVS能够将外部请求根据特定的算法分发到后端的多个服务器上,…...
回顾Python
一、python基础 1、环境python2、python3 [rootpython ~]# yum list installed | grep python #检查是否有python包 [rootpython ~]# yum list installed | grep epel #检查是否有epel包 [rootpython ~]# yum -y install epel-release [rootpython ~]# yum -y install …...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...
