Java程序打包常見幾種方式的完整步驟(Maven/Gradle/?手動(dòng)打包)
前言
將 Java 程序打包成可執(zhí)行文件或分發(fā)包的方式,取決于你的項(xiàng)目類型(普通 Java 項(xiàng)目、Maven/Gradle 項(xiàng)目)和需求(是否需要跨平臺(tái)、是否包含依賴等)。以下是幾種常見的打包方法:
一、基礎(chǔ)方法:使用javac+jar命令手動(dòng)打包(適合簡單項(xiàng)目)
如果是不含第三方依賴的簡單 Java 項(xiàng)目,可通過 JDK 自帶工具手動(dòng)打包:
編譯 Java 源碼假設(shè)項(xiàng)目結(jié)構(gòu)如下:
plaintext
myapp/ └── src/ └── com/ └── example/ └── Main.java // 主類,含 main 方法編譯生成 class 文件:
bash
# 進(jìn)入 src 目錄的父級(jí) cd myapp # 編譯所有 .java 文件,輸出到 classes 目錄 javac -d classes src/com/example/Main.java
創(chuàng)建 MANIFEST.MF 文件用于指定主類(可執(zhí)行 JAR 必需),在
classes目錄下創(chuàng)建META-INF/MANIFEST.MF:plaintext
Manifest-Version: 1.0 Main-Class: com.example.Main # 主類全限定名(包名+類名)
打包成 JAR 文件
bash
# 進(jìn)入 classes 目錄 cd classes # 打包當(dāng)前目錄下的所有文件為 myapp.jar jar cfm ../myapp.jar META-INF/MANIFEST.MF .
運(yùn)行 JAR 文件
bash
java -jar myapp.jar
二、Maven 項(xiàng)目打包(推薦,適合帶依賴的項(xiàng)目)
如果使用 Maven 管理項(xiàng)目,可通過 maven-jar-plugin 或 maven-assembly-plugin 打包:
配置
pom.xml在pom.xml中添加打包插件(以包含所有依賴為例):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.example.Main</mainClass> <!-- 主類全限定名 --> </manifest> </archive> </configuration> </plugin> <!-- 打包所有依賴到一個(gè) JAR 中(fat jar) --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.4.2</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.example.Main</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>執(zhí)行打包命令
bash
mvn clean package
打包結(jié)果在
target目錄下:myapp-1.0-SNAPSHOT.jar:僅包含項(xiàng)目自身代碼的 JARmyapp-1.0-SNAPSHOT-jar-with-dependencies.jar:包含所有依賴的可執(zhí)行 JAR(推薦運(yùn)行這個(gè))
運(yùn)行打包后的 JAR
bash
java -jar target/myapp-1.0-SNAPSHOT-jar-with-dependencies.jar
三、Gradle 項(xiàng)目打包(適合帶依賴的項(xiàng)目)
Gradle 項(xiàng)目可通過 application 插件或 shadow 插件打包:
配置
build.gradle(或build.gradle.kts)groovy
plugins { id 'java' id 'application' // 用于生成可執(zhí)行腳本 id 'com.github.johnrengelman.shadow' version '7.1.2' // 用于打 fat jar } mainClassName = 'com.example.Main' // 主類全限定名 // 配置 shadow 插件(可選,生成包含依賴的 JAR) shadowJar { archiveBaseName = 'myapp' archiveVersion = '1.0' archiveClassifier = 'all' }執(zhí)行打包命令
bash
# 生成包含依賴的 fat jar gradle shadowJar # 或生成可執(zhí)行腳本(Windows 為 .bat,Linux 為 .sh) gradle installDist
運(yùn)行打包結(jié)果
- Fat jar:
java -jar build/libs/myapp-1.0-all.jar - 可執(zhí)行腳本:
build/install/myapp/bin/myapp(Linux)或build/install/myapp/bin/myapp.bat(Windows)
- Fat jar:
四、打包成 EXE 或原生應(yīng)用(適合 Windows 桌面程序)
如果需要將 Java 程序打包成 Windows 可執(zhí)行文件(.exe),可使用第三方工具:
Launch4j
- 功能:將 JAR 包包裝成 EXE,支持指定 JRE 版本、圖標(biāo)等。
- 步驟:
- 下載 Launch4j 并安裝
- 配置「Input file」為你的 JAR 路徑,「Output file」為生成的 EXE 路徑
- 配置「JRE」選項(xiàng)(如最小版本),點(diǎn)擊「Build wrapper」生成 EXE
Excelsior JET
- 功能:將 Java 字節(jié)碼編譯為原生機(jī)器碼(.exe),不依賴 JRE,啟動(dòng)更快。
- 適合商業(yè)項(xiàng)目(免費(fèi)版有功能限制)。
五、打包注意事項(xiàng)
依賴管理
- 簡單項(xiàng)目:手動(dòng)復(fù)制依賴 JAR 到指定目錄,運(yùn)行時(shí)通過
-cp指定類路徑。 - 復(fù)雜項(xiàng)目:優(yōu)先使用 Maven/Gradle 的 fat jar 功能,避免依賴缺失。
- 簡單項(xiàng)目:手動(dòng)復(fù)制依賴 JAR 到指定目錄,運(yùn)行時(shí)通過
主類指定
- 可執(zhí)行 JAR 必須在 MANIFEST.MF 中指定
Main-Class,否則需通過java -cp jar包 主類名運(yùn)行。
- 可執(zhí)行 JAR 必須在 MANIFEST.MF 中指定
JRE 依賴
- 打包后的 JAR 或 EXE 仍需目標(biāo)機(jī)器安裝對(duì)應(yīng)版本的 JRE(除非使用 Excelsior JET 等工具編譯為原生代碼)。
資源文件
- 確保項(xiàng)目中的資源文件(如配置文件、圖片)被正確打包到 JAR 中,讀取時(shí)使用
getClass().getResourceAsStream()方法。
- 確保項(xiàng)目中的資源文件(如配置文件、圖片)被正確打包到 JAR 中,讀取時(shí)使用
根據(jù)項(xiàng)目復(fù)雜度選擇合適的方法:簡單項(xiàng)目用 jar 命令,依賴較多的項(xiàng)目用 Maven/Gradle,需原生 EXE 則用 Launch4j 等工具。
到此這篇關(guān)于Java程序打包常見幾種方式(Maven/Gradle/ 手動(dòng)打包)的文章就介紹到這了,更多相關(guān)Java程序打包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java調(diào)用UniHttp接口請(qǐng)求失敗的三種解決策略
在當(dāng)今數(shù)字化時(shí)代,不管是內(nèi)部系統(tǒng)之間還是跟外部系統(tǒng)的對(duì)接,接口調(diào)用已成為軟件開發(fā)中不可或缺的一部分,本文主要介紹了Java調(diào)用UniHttp接口請(qǐng)求失敗的三種解決策略,希望對(duì)大家有所幫助2025-09-09
Java 騰訊驗(yàn)證碼平臺(tái)使用實(shí)例
這篇文章主要介紹了Java 騰訊驗(yàn)證碼平臺(tái)使用實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
MyBatisPlus 主鍵策略的實(shí)現(xiàn)(4種)
MyBatis Plus 集成了多種主鍵策略,幫助用戶快速生成主鍵,本文主要介紹了MyBatisPlus主鍵策略的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
java將XML文檔轉(zhuǎn)換成json格式數(shù)據(jù)的示例
本篇文章主要介紹了java將XML文檔轉(zhuǎn)換成json格式數(shù)據(jù)的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
SpringMVC處理器映射器HandlerMapping詳解
這篇文章主要介紹了SpringMVC處理器映射器HandlerMapping詳解,在SpringMVC中會(huì)有很多請(qǐng)求,每個(gè)請(qǐng)求都需要一個(gè)HandlerAdapter處理,具體接收到一個(gè)請(qǐng)求之后使用哪個(gè)HandlerAdapter進(jìn)行處理呢,他們的過程是什么,需要的朋友可以參考下2023-09-09

