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

相关推荐
事圆则缓1 小时前
Java 异常、日志与 Android 崩溃定位
java
砍材农夫2 小时前
spring|spring web|拦截器、过滤器、aop
java·spring boot·spring·spring cloud
mldong9 小时前
一个 App,十三套后端:手机审批端 uni-jeeflow-app 开源了
java·架构
tqs_1234510 小时前
MySQL RR隔离级别死锁|Gap间隙锁、临键锁,订单并发范围查询死锁根因方案
java
逆境不可逃10 小时前
Pi Agent 学习笔记:多个工具怎样并行执行
java
Flynt11 小时前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
Bs_MoneyMagnet11 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
星云API技术支持11 小时前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
niucloud-admin12 小时前
JAVA V6 多商户商城 开发文档——job 计划任务开发
java·python·github