# Java文件打包成可执行JAR包(两种方式:原生javac\+jar命令 / Maven)

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 启动。


常见坑

  1. Main-Class 类名写错,或者末尾没有换行 → 提示 no main manifest attribute

  2. 类有 package,打包时不能只放 Hello.class,必须保留完整包目录 com/demo/

  3. 普通 jar≠胖 jar:只有胖 jar 才自带第三方依赖,否则缺包报错

  4. 文件名中文 / 空格尽量不要用

相关推荐
wangchunyu11415 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
paopaokaka_luck16 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
Thomas.Sir16 小时前
第9课:SpringBoot4.x Web开发基础:WebMvc自动配置、静态资源、请求参数接收
java·spring boot
程序 代码狂人16 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
2501_9445215917 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
南归北隐18 小时前
Spring AI Alibaba Graph框架实现MCP数据库查询实战
java·后端·spring ai·mcp·spring ai mcp
古法老登瞎折腾18 小时前
大数据智能运维实战(九):让 AI 查日志——找到异常,也保留上下文
java·大数据·运维·人工智能·spring ai·mcp
ai大模型-探索者19 小时前
Function Call与MCP(区别、联系与实战)
java·服务器·网络
略略略咯咯19 小时前
啊啊啊啊啊
java·服务器·数据库
SL_staff19 小时前
运维救火实战:钉钉API变更致薪资计算中断,如何用可视化逻辑引擎5分钟热修复
java·开源·全栈