將Java項(xiàng)目打包為可執(zhí)行JAR文件的完整流程
本文將詳細(xì)介紹將 Java 項(xiàng)目打包為可執(zhí)行 JAR 文件的完整流程,包括使用 IDE 和命令行兩種方法。
方法一:使用 IntelliJ IDEA 打包
步驟 1:配置項(xiàng)目結(jié)構(gòu)
- 打開項(xiàng)目
- 點(diǎn)擊 File > Project Structure
- 在 Project Settings 中選擇 Artifacts
- 點(diǎn)擊 + 號 > JAR > From modules with dependencies
步驟 2:配置主類
- 在 "Main Class" 字段選擇主類:例如:
com.example.demo.DesktopFileSearch - 確保選擇 "extract to the target JAR" 選項(xiàng)
- 點(diǎn)擊 OK
步驟 3:構(gòu)建 JAR 文件
- 點(diǎn)擊 Build > Build Artifacts
- 選擇您的 artifact > Build
- 生成的 JAR 文件將位于
out/artifacts/目錄下
方法二:使用 Maven 打包
步驟 1:添加 Maven 插件
在 pom.xml 中添加以下插件配置:
<build>
<plugins>
<!-- 編譯插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- 創(chuàng)建可執(zhí)行 JAR 的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.example.demo.DesktopFileSearch</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- 包含依賴的插件(可選) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.demo.DesktopFileSearch</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>
</plugins>
</build>步驟 2:執(zhí)行打包命令
在項(xiàng)目根目錄(包含 pom.xml 的目錄)打開命令行,執(zhí)行:
mvn clean package
步驟 3:獲取 JAR 文件
生成的 JAR 文件位于 target/ 目錄
如果使用了 assembly 插件,會生成兩個(gè)文件:
your-project-name.jar- 不含依賴your-project-name-jar-with-dependencies.jar- 包含所有依賴
方法三:使用 Gradle 打包
步驟 1:配置 build.gradle
在 build.gradle 文件中添加:
plugins {
id 'java'
id 'application'
}
application {
mainClassName = 'com.example.demo.DesktopFileSearch'
}
jar {
manifest {
attributes 'Main-Class': 'com.example.demo.DesktopFileSearch'
}
// 包含所有依賴(可選)
from {
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
}步驟 2:執(zhí)行打包命令
在項(xiàng)目根目錄執(zhí)行:
gradle clean build
步驟 3:獲取 JAR 文件
生成的 JAR 文件位于 build/libs/ 目錄
方法四:手動創(chuàng)建 JAR(不使用構(gòu)建工具)
步驟 1:編譯 Java 文件
javac -d target/classes src/main/java/com/example/demo/*.java
步驟 2:創(chuàng)建清單文件
創(chuàng)建 META-INF/MANIFEST.MF 文件:
Manifest-Version: 1.0 Main-Class: com.example.demo.DesktopFileSearch Class-Path: .
步驟 3:打包為 JAR
jar cfm target/your-app.jar META-INF/MANIFEST.MF -C target/classes .
測試 JAR 文件
運(yùn)行 JAR 文件以確保正確打包:
java -jar your-app.jar
常見問題解決
問題:運(yùn)行 JAR 時(shí)出現(xiàn) "No main manifest attribute"
解決方案:
- 確保 MANIFEST.MF 文件包含正確的 Main-Class 屬性
- 使用
jar tf your-app.jar檢查清單文件是否正確包含 - 如果使用 Maven/Gradle,確保插件配置正確
問題:缺少依賴項(xiàng)
解決方案:
使用包含依賴的打包方式(如 maven-assembly-plugin)
將所有依賴 JAR 放在同一目錄,使用 -cp 指定類路徑:
java -cp "your-app.jar:libs/*" com.example.demo.DesktopFileSearch
問題:資源文件未包含
解決方案:
確保資源文件位于正確位置(如 src/main/resources)
在構(gòu)建配置中包含資源目錄:
java -cp "your-app.jar:libs/*" com.example.demo.DesktopFileSearch
最佳實(shí)踐
版本控制:在 JAR 文件名中包含版本號
依賴管理:
- 對于簡單項(xiàng)目,使用包含依賴的單一 JAR
- 對于大型項(xiàng)目,使用 lib 目錄存放依賴
簽名驗(yàn)證:使用 jarsigner 對 JAR 進(jìn)行簽名
jarsigner -keystore mykeystore.jks -storepass password -keypass password your-app.jar mykey
瘦身打包:使用 ProGuard 或其它工具減小 JAR 大小
跨平臺測試:在不同操作系統(tǒng)上測試 JAR 文件
總結(jié)
打包 Java 應(yīng)用程序?yàn)?JAR 文件是分發(fā)和部署的關(guān)鍵步驟。選擇適合您項(xiàng)目的打包方法:
- 簡單項(xiàng)目:使用 IDE 內(nèi)置的導(dǎo)出功能
- 標(biāo)準(zhǔn)項(xiàng)目:使用 Maven 或 Gradle 構(gòu)建
- 需要依賴管理:使用包含依賴的打包方式
- 特殊需求:手動創(chuàng)建 JAR 文件
完成 JAR 打包后,您可以進(jìn)一步使用 Launch4j 或 jpackage 工具將其轉(zhuǎn)換為 EXE 文件,創(chuàng)建完整的 Windows 安裝程序。
以上就是將Java項(xiàng)目打包為可執(zhí)行JAR文件的完整流程的詳細(xì)內(nèi)容,更多關(guān)于Java項(xiàng)目打包可執(zhí)行JAR的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java中Stringbuild,Date和Calendar類的用法詳解
這篇文章主要為大家詳細(xì)介紹了Java中Stringbuild、Date和Calendar類的用法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-04-04
SpringBoot?使用AOP?+?Redis?防止表單重復(fù)提交的方法
Spring?Boot是一個(gè)用于構(gòu)建Web應(yīng)用程序的框架,通過AOP可以實(shí)現(xiàn)防止表單重復(fù)提交,本文介紹了在Spring?Boot應(yīng)用程序中使用AOP和Redis來防止表單重復(fù)提交的方法,需要的朋友可以參考下2023-04-04
Java反射通過Getter方法獲取對象VO的屬性值過程解析
這篇文章主要介紹了Java反射通過Getter方法獲取對象VO的屬性值過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02

