Java程序打包常見幾種方式的完整步驟(Maven/Gradle/?手動打包)
前言
將 Java 程序打包成可執(zhí)行文件或分發(fā)包的方式,取決于你的項目類型(普通 Java 項目、Maven/Gradle 項目)和需求(是否需要跨平臺、是否包含依賴等)。以下是幾種常見的打包方法:
一、基礎方法:使用javac+jar命令手動打包(適合簡單項目)
如果是不含第三方依賴的簡單 Java 項目,可通過 JDK 自帶工具手動打包:
編譯 Java 源碼假設項目結構如下:
plaintext
myapp/ └── src/ └── com/ └── example/ └── Main.java // 主類,含 main 方法編譯生成 class 文件:
bash
# 進入 src 目錄的父級 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
# 進入 classes 目錄 cd classes # 打包當前目錄下的所有文件為 myapp.jar jar cfm ../myapp.jar META-INF/MANIFEST.MF .
運行 JAR 文件
bash
java -jar myapp.jar
二、Maven 項目打包(推薦,適合帶依賴的項目)
如果使用 Maven 管理項目,可通過 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> <!-- 打包所有依賴到一個 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
打包結果在
target目錄下:myapp-1.0-SNAPSHOT.jar:僅包含項目自身代碼的 JARmyapp-1.0-SNAPSHOT-jar-with-dependencies.jar:包含所有依賴的可執(zhí)行 JAR(推薦運行這個)
運行打包后的 JAR
bash
java -jar target/myapp-1.0-SNAPSHOT-jar-with-dependencies.jar
三、Gradle 項目打包(適合帶依賴的項目)
Gradle 項目可通過 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
運行打包結果
- 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 或原生應用(適合 Windows 桌面程序)
如果需要將 Java 程序打包成 Windows 可執(zhí)行文件(.exe),可使用第三方工具:
Launch4j
- 功能:將 JAR 包包裝成 EXE,支持指定 JRE 版本、圖標等。
- 步驟:
- 下載 Launch4j 并安裝
- 配置「Input file」為你的 JAR 路徑,「Output file」為生成的 EXE 路徑
- 配置「JRE」選項(如最小版本),點擊「Build wrapper」生成 EXE
Excelsior JET
- 功能:將 Java 字節(jié)碼編譯為原生機器碼(.exe),不依賴 JRE,啟動更快。
- 適合商業(yè)項目(免費版有功能限制)。
五、打包注意事項
依賴管理
- 簡單項目:手動復制依賴 JAR 到指定目錄,運行時通過
-cp指定類路徑。 - 復雜項目:優(yōu)先使用 Maven/Gradle 的 fat jar 功能,避免依賴缺失。
- 簡單項目:手動復制依賴 JAR 到指定目錄,運行時通過
主類指定
- 可執(zhí)行 JAR 必須在 MANIFEST.MF 中指定
Main-Class,否則需通過java -cp jar包 主類名運行。
- 可執(zhí)行 JAR 必須在 MANIFEST.MF 中指定
JRE 依賴
- 打包后的 JAR 或 EXE 仍需目標機器安裝對應版本的 JRE(除非使用 Excelsior JET 等工具編譯為原生代碼)。
資源文件
- 確保項目中的資源文件(如配置文件、圖片)被正確打包到 JAR 中,讀取時使用
getClass().getResourceAsStream()方法。
- 確保項目中的資源文件(如配置文件、圖片)被正確打包到 JAR 中,讀取時使用
根據(jù)項目復雜度選擇合適的方法:簡單項目用 jar 命令,依賴較多的項目用 Maven/Gradle,需原生 EXE 則用 Launch4j 等工具。
到此這篇關于Java程序打包常見幾種方式(Maven/Gradle/ 手動打包)的文章就介紹到這了,更多相關Java程序打包內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
源碼解讀Spring-Integration執(zhí)行過程
Spring-Integration基于Spring,在應用程序中啟用了輕量級消息傳遞,并支持通過聲明式適配器與外部系統(tǒng)集成,今天主要是看個簡單的hello word進來分析下整個執(zhí)行過程,感興趣的朋友一起看看吧2021-06-06
Springboot使用Spring Data JPA實現(xiàn)數(shù)據(jù)庫操作
Spring Data JPA 是 Spring 基于 Spring Data 框架、在JPA 規(guī)范的基礎上開發(fā)的一個框架,使用 Spring Data JPA 可以極大地簡化JPA 的寫法,本章我們將詳細介紹在Springboot中使用 Spring Data JPA 來實現(xiàn)對數(shù)據(jù)庫的操作2021-06-06
Java中注解@Async實現(xiàn)異步及導致失效原因分析
Async注解用于聲明一個方法是異步的,當在方法上加上這個注解時將會在一個新的線程中執(zhí)行該方法,而不會阻塞原始線程,這篇文章主要給大家介紹了關于Java中注解@Async實現(xiàn)異步及導致失效原因分析的相關資料,需要的朋友可以參考下2024-07-07

