Java 文件打包成可执行 JAR 包(两种方式:原生 javac+jar 命令 / Maven)
可执行 jar 核心:
MANIFEST.MF文件指定 Main-Class(带 main 方法的入口类)
方式一:原生 JDK 命令(不用 Maven/Gradle,纯命令行)
目录示例
Plain
src/
└── com/
└── demo/
└── Hello.java
Hello.java
java
package com.demo;
public class Hello {
public static void main(String[] args) {
System.out.println("Hello Jar");
}
}
1. 编译 java,生成 class
进入 src 目录执行:
bash
javac com/demo/Hello.java
生成 com/demo/Hello.class
2. 编写清单文件 manifest.mf
新建文件 manifest.mf(注意最后一行必须空行,否则报错)
mf
Manifest-Version: 1.0
Main-Class: com.demo.Hello
注意:
Main-Class:后面有空格,写全类名 ,不要加.class
3. 打包 jar
bash
jar cvfm hello.jar manifest.mf com/
参数说明:
-
c创建 jar -
v打印详情 -
f指定 jar 文件名 -
m指定自定义 manifest 文件
4. 运行
bash
java -jar hello.jar
⚠️ 缺点:如果项目有第三方依赖包,这种方式打包后运行会报
ClassNotFoundException,原生 jar 不会自动把依赖打进包。
方式二:Maven 打包(推荐,SpringBoot 项目常用)
普通 Java 项目(非 SpringBoot)
pom.xml 配置 maven-jar-plugin 指定入口类
xml
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<!-- 入口全类名 -->
<mainClass>com.demo.Hello</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
打包命令:
bash
mvn clean package
⚠️ 普通 jar:不会包含第三方依赖,运行时需要把依赖放到 classpath。
如果需要把所有依赖一起打进一个胖 jar(all-in-one)
用 maven-assembly-plugin
xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.7.1</version>
<configuration>
<archive>
<manifest>
<mainClass>com.demo.Hello</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
打包后会生成 xxx-jar-with-dependencies.jar,直接 java -jar 运行,自带全部依赖。
✅ SpringBoot 项目打包(最常用)
SpringBoot 自带 spring-boot-maven-plugin,打包出来就是可执行 jar(内置 tomcat)
xml
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
打包命令同样:
bash
mvn clean package
直接 java -jar xxx.jar 启动。
常见坑
-
Main-Class类名写错,或者末尾没有换行 → 提示no main manifest attribute -
类有 package,打包时不能只放 Hello.class,必须保留完整包目录
com/demo/ -
普通 jar≠胖 jar:只有胖 jar 才自带第三方依赖,否则缺包报错
-
文件名中文 / 空格尽量不要用