1️⃣jar包
怎么来
以 IDEA maven项目为例,jar包由Java工程通过mvn pakage命令打包生成的。(题外话:web项目打包成war包)。
怎么运行
1 | java -jar xx.jar |
有什么
以spring boot项目为例,包内结构如下:
1 | +- BOOT-INF # 应用文件夹 |
配置文件:MANIFEST.MF
1 | Manifest-Version: 1.0 |
spring boot项目jar包启动流程:
JarLauncher按照MANIFEST.MF中Spring-Boot-Classes和Spring-Boot-Lib的配置,将类文件和依赖加载到classpath下,然后调用Start-Class配置的应用启动类。
2️⃣jar生成原理
-
准备一份
java文件,例如Test.java:1
2
3
4
5public class Test {
public static void main(String[] args) {
System.out.println("hello jar");
}
} -
javac Test.java生成Test.class文件 -
jar -cvf test.jar Test.classc 表示要创建一个新的jar包
v 表示创建的过程中在控制台输出创建过程的一些信息,
f 表示给生成的jar包命名
-
运行
test.jar时报错,test.jar中没有主清单属性原因是:
test.jar中META-INF文件夹下的MENIFEST.MF文件缺少了Main-Class属性
修复:
1 | 列出文件清单 |
- 此时
java -jar test.jar就可以运行了。
maven下修复:
-
在
pom.xml文件中配置maven-jar-plugin插件,指定archive的manifest的mainClass属性。例如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>你的主类全名</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
将你的主类全名替换为你的应用程序的主类的完整名称,例如com.example.MainApp。
- 如果你的项目是一个包含多个模块的Maven项目,确保每个模块的
pom.xml中都有正确的主类配置。 - 如果你的应用程序是一个可执行的WAR,确保你的
pom.xml中配置了正确的<packaging>类型,并且maven-war-plugin配置中包含了正确的web.xml。
3️⃣更新后重新打包
-
解压
jar -xvf xx.jar -
修改改后,重新打包
jar -cvfM0 xx.jar BOOT-INF/ META-INF/ org/