# 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. 文件名中文 / 空格尽量不要用

相关推荐
一技安身17 小时前
【java】JDK8 + JDK17 绿色解压共存方案-全程不修改任何系统环境变量
java·开发语言
java、iOS、Vue18 小时前
Maven antrun vs Jenkins 脚本组装 deb的优缺点、适用场景
java·jenkins·maven
hudd66818 小时前
JavaEE 初阶 - 多线程(初阶)
java·开发语言·java-ee
CarIise18 小时前
Java实训阶段查漏补缺复习笔记2
java·linux·算法
Wang's Blog18 小时前
Java框架 SpringCloud 快速入门: Feign 的性能优化
java·spring cloud·性能优化
蛋蛋的就会顺顺的18 小时前
hot100——二叉树
java·数据结构·算法·leetcode·力扣
打工仔折腾 AI19 小时前
System Prompt 替代 Few-shot:用规则约束大模型输出的省钱实践
java·人工智能·python·spring·langchain·prompt·ai agent 实战
CarIise19 小时前
Java实训阶段查漏补缺复习笔记1
java·开发语言·笔记
vx-程序开发20 小时前
【计算机毕设】51300童装超市管理系统的设计与实现
java·vue.js·spring boot·源码·课程设计·毕设·大作业
ym hyd 11120 小时前
题库建立与考试系统源码 Java+SpringBoot+Vue3 前后分离
java·开发语言·vue.js·spring boot·毕设