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愉快玩耍。
到此这篇关于springboot解决no main manifest attribute错误的文章就介绍到这了,更多相关springboot no main manifest attribute内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论