Java程序打包常見幾種方式的完整步驟(Maven/Gradle/?手動(dòng)打包)
前言
將 Java 程序打包成可執(zhí)行文件或分發(fā)包的方式,取決于你的項(xiàng)目類型(普通 Java 項(xiàng)目、Maven/Gradle 項(xiàng)目)和需求(是否需要跨平臺(tái)、是否包含依賴等)。以下是幾種常見的打包方法:
一、基礎(chǔ)方法:使用javac+jar命令手動(dòng)打包(適合簡(jiǎn)單項(xiàng)目)
如果是不含第三方依賴的簡(jiǎn)單 Java 項(xiàng)目,可通過(guò) 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)目,可通過(guò) 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)目可通過(guò) 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)
依賴管理
- 簡(jiǎn)單項(xiàng)目:手動(dòng)復(fù)制依賴 JAR 到指定目錄,運(yùn)行時(shí)通過(guò)
-cp指定類路徑。 - 復(fù)雜項(xiàng)目:優(yōu)先使用 Maven/Gradle 的 fat jar 功能,避免依賴缺失。
- 簡(jiǎn)單項(xiàng)目:手動(dòng)復(fù)制依賴 JAR 到指定目錄,運(yùn)行時(shí)通過(guò)
主類指定
- 可執(zhí)行 JAR 必須在 MANIFEST.MF 中指定
Main-Class,否則需通過(guò)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ù)雜度選擇合適的方法:簡(jiǎn)單項(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)文章
詳解基于Spring Data的領(lǐng)域事件發(fā)布
這篇文章主要介紹了詳解基于Spring Data的領(lǐng)域事件發(fā)布,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
源碼解讀Spring-Integration執(zhí)行過(guò)程
Spring-Integration基于Spring,在應(yīng)用程序中啟用了輕量級(jí)消息傳遞,并支持通過(guò)聲明式適配器與外部系統(tǒng)集成,今天主要是看個(gè)簡(jiǎn)單的hello word進(jìn)來(lái)分析下整個(gè)執(zhí)行過(guò)程,感興趣的朋友一起看看吧2021-06-06
淺談Spring與SpringMVC父子容器的關(guān)系與初始化
這篇文章主要介紹了淺談Spring與SpringMVC父子容器的關(guān)系與初始化,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
Springboot使用Spring Data JPA實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作
Spring Data JPA 是 Spring 基于 Spring Data 框架、在JPA 規(guī)范的基礎(chǔ)上開發(fā)的一個(gè)框架,使用 Spring Data JPA 可以極大地簡(jiǎn)化JPA 的寫法,本章我們將詳細(xì)介紹在Springboot中使用 Spring Data JPA 來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作2021-06-06
Java中注解@Async實(shí)現(xiàn)異步及導(dǎo)致失效原因分析
Async注解用于聲明一個(gè)方法是異步的,當(dāng)在方法上加上這個(gè)注解時(shí)將會(huì)在一個(gè)新的線程中執(zhí)行該方法,而不會(huì)阻塞原始線程,這篇文章主要給大家介紹了關(guān)于Java中注解@Async實(shí)現(xiàn)異步及導(dǎo)致失效原因分析的相關(guān)資料,需要的朋友可以參考下2024-07-07
JDK數(shù)組阻塞隊(duì)列源碼深入分析總結(jié)
在這篇文章當(dāng)中,我們將通過(guò)源碼仔細(xì)為大家介紹一下JDK具體是如何實(shí)現(xiàn)數(shù)組阻塞隊(duì)列的,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-08-08
Java編程調(diào)用微信接口實(shí)現(xiàn)圖文信息推送功能
這篇文章主要介紹了Java編程調(diào)用微信接口實(shí)現(xiàn)圖文信息等推送功能,涉及java微信圖文信息推送接口調(diào)用及相關(guān)文件、字符串編碼轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2017-08-08

