当前位置: 首页 > news >正文

解决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文件的额外信息。清单文件的主要功能:

    1. 指定主类:在清单文件中,可以指定包含main方法的类,这是Java应用程序的入口点。这允许用户通过java -jar命令直接运行JAR文件。
    1. 定义属性:清单文件可以包含属性,这些属性可以是键值对的形式,用于存储关于JAR文件的额外信息,比如版本号、作者信息等。
    1. 指定类路径:在清单文件中可以定义类路径(Class-Path)属性,指定在运行JAR文件时需要包含的其他JAR文件或目录。
    1. 安全设置:清单文件可以包含安全相关的设置,比如指定需要哪些权限。
    1. 扩展名映射:可以定义文件扩展名到类名的映射,这样当运行具有特定扩展名的文件时,JAR文件中的特定类将被用来处理这些文件。
    1. 其他自定义信息:开发者可以根据需要在清单文件中添加自定义的元数据。

这里可以解压一个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&#xff1a;4. 添加执行入口 0. 背景 在开发Spring boot项目的时候&#xff0c;有时候会需要使用java -jar test-1.0-SNAPSHOT.jar指令来运行开发的java应用&#xff0c;但是很不幸&#…...

002 | 常见的金融量化指标计算

金融量化指标 在金融量化分析中&#xff0c;常用的指标可以帮助我们判断市场走势、评估风险和收益&#xff0c;以及构建交易策略。以下是一些常见的金融量化指标及其计算方法的详细教程&#xff0c;包括公式与Python代码实现。 1. 移动平均线&#xff08;Moving Average, MA&…...

Web Vitals:提升用户体验的关键指标

Web Vitals 是 Google 提出的一套核心网页性能指标&#xff0c;旨在帮助开发者理解和优化网站的用户体验。这些指标分为核心 Web Vitals 和附加 Web Vitals&#xff0c;涵盖了加载性能、交互性和视觉稳定性三个方面。以下是详细的介绍和如何使用 Web Vitals 来优化你的网站。 …...

c#中的约束、TimeSpan、defult、operator

c#中的约束 在C#中&#xff0c;约束&#xff08;Constraints&#xff09;用于限制泛型类型参数的类型&#xff0c;以确保泛型类型或方法在编译时能够满足特定的要求。约束允许开发者指定泛型类型参数必须满足的条件&#xff0c;比如实现特定的接口或继承自特定的类。以下是一些…...

挖矿木马攻破了服务器

最近被国外的挖矿木马攻破了服务器 根据非法登录&#xff0c;用 #last指令查看登录ip 首先删掉登录主机 #kill -9 pts/0 第二步 #top 看看什么占用cpu高 第三步杀死狂刷CPU的服务 过一分钟后&#xff0c;服务又开始狂刷cpu。 第四步根据pid查到服务地址 #systemctl status…...

从容应对技术面试:策略、技巧与成功案例

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: 工💗重💗hao💗:野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、应用领域等内容。 ⭐…...

Spring Boot 整合 RestTemplate:详解与实战

Spring Boot 整合 RestTemplate&#xff1a;详解与实战指南 一、引言二、依赖添加Maven 示例&#xff1a;Gradle 示例&#xff1a; 三、创建 RestTemplate 实例四、使用 RestTemplate 发起请求五、处理响应六、高级用法1. 自定义 RestTemplate 实例2. 文件上传、下载以及常见的…...

【利用模板模式和责任链模式实现数据校验】

利用模板模式和责任链模式实现数据校验 一、业务背景二、模板模式和责任链模式代码实现1、数据校验抽象处理器ValidateHandler2、数据校验责任链工具类ValidateChainUtil3、网元调整数据校验抽象类AbstractNodeCheckHandler4、依次定义3个责任链handler&#xff0c;通过Order注…...

学习笔记第十九天

1.标准I/O的基本概念 标准输入&#xff08;stdin&#xff09;&#xff1a;默认是指键盘输入。 标准输出&#xff08;stdout&#xff09;&#xff1a;默认是指显示器输出。 标准错误&#xff08;stderr&#xff09;&#xff1a;用于输出错误信息&#xff0c;也是指向显示器&…...

设计模式 - 单例模式

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、单例模…...

fastapi之WebSockets

文章目录 WebSockets基本概念FastAPI 中的 WebSocket 支持WebSocket 应用示例示例 1: 简单的 WebSocket 连接解释 示例 2: 广播消息的 WebSocket 实现解释 客户端代码示例 完整示例项目结构服务器端代码 (main.py)解释 简单的前端客户端 (static/index.html)解释 测试 相关代码…...

Kotlin 和 Java区别

Kotlin 和 Java 是两种主要用于 Android 开发的编程语言&#xff0c;它们之间有一些关键的区别&#xff1a; 1. 语法简洁性&#xff1a; Kotlin&#xff1a;具有更简洁的语法&#xff0c;减少了冗余代码。例如&#xff0c;Kotlin 支持类型推断&#xff0c;避免了大量的样板…...

windows 达梦到ORACLE dblink

达梦通过DBLINK访问Oracle数据库有两种: 方式一&#xff1a;通过Oracle oci接口; 方式二&#xff1a;一种是通过ODBC数据源的方式。 本案例选择使用Oralce OCI的方式去访问Oracle数据库。 配置Oracle OCI客户端 下载地址&#xff1a;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端口做网络访问控制&#xff0c;如设置iptables…...

算法训练.

一.扩散 题解&#xff1a; 计算点之间的距离&#xff0c;然后对图进行处理即可&#xff0c;这个数据规模较小&#xff0c;因此我使用了floyd,还有最小生成树和二份答案加并查集的写法&#xff1b; 代码&#xff1a; #include <iostream> #include <cstring> #in…...

08、MySQL-事务

目录 1、事务简介 2、事务操作 2.1 方式一 2.2 方式二 3、事务四大特性 4、并发事务问题 5、事务隔离级别 1、事务简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c…...

2024 年的 Node.js 生态系统

数据来源于 Node.js Toolbox&#xff0c;网站展示了 Node.js 生态系统中积极维护且流行的库。...

LVS(Linux Virtual Server)

简介 LVS&#xff08;Linux Virtual Server&#xff09;是一个高性能的开源负载均衡解决方案&#xff0c;它通过在Linux内核中实现IPVS&#xff08;IP Virtual Server&#xff09;模块来提供负载均衡功能。LVS能够将外部请求根据特定的算法分发到后端的多个服务器上&#xff0c…...

回顾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 …...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...