如何將 Java 項目打包為可執行 JAR 文件

如何將 Java 項目打包為可執行 JAR 文件

我將詳細介紹將 Java 項目打包為可執行 JAR 文件的完整流程,包括使用 IDE 和命令行兩種方法。

方法一:使用 IntelliJ IDEA 打包

步驟 1:配置項目結構

  1. 打開項目

  2. 點擊 File > Project Structure

  3. 在 Project Settings 中選擇 Artifacts

  4. 點擊 + 號 > JAR > From modules with dependencies

步驟 2:配置主類

  1. 在 "Main Class" 字段選擇主類:例如:com.example.demo.DesktopFileSearch

  2. 確保選擇 "extract to the target JAR" 選項

  3. 點擊 OK

步驟 3:構建 JAR 文件

  1. 點擊 Build > Build Artifacts

  2. 選擇您的 artifact > Build

  3. 生成的 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><!-- 創建可執行 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:執行打包命令

在項目根目錄(包含 pom.xml 的目錄)打開命令行,執行:

mvn clean package

步驟 3:獲取 JAR 文件

  1. 生成的 JAR 文件位于?target/?目錄

  2. 如果使用了 assembly 插件,會生成兩個文件:

    • 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:執行打包命令

在項目根目錄執行:

gradle clean build

步驟 3:獲取 JAR 文件

生成的 JAR 文件位于?build/libs/?目錄

方法四:手動創建 JAR(不使用構建工具)

步驟 1:編譯 Java 文件

javac -d target/classes src/main/java/com/example/demo/*.java

步驟 2:創建清單文件

創建?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 文件

運行 JAR 文件以確保正確打包:

java -jar your-app.jar

常見問題解決

問題:運行 JAR 時出現 "No main manifest attribute"

解決方案

  1. 確保 MANIFEST.MF 文件包含正確的 Main-Class 屬性

  2. 使用?jar tf your-app.jar?檢查清單文件是否正確包含

  3. 如果使用 Maven/Gradle,確保插件配置正確

問題:缺少依賴項

解決方案

  1. 使用包含依賴的打包方式(如 maven-assembly-plugin)

  2. 將所有依賴 JAR 放在同一目錄,使用?-cp?指定類路徑:

    java -cp "your-app.jar:libs/*" com.example.demo.DesktopFileSearch

問題:資源文件未包含

解決方案

  1. 確保資源文件位于正確位置(如 src/main/resources)

  2. 在構建配置中包含資源目錄:

    java -cp "your-app.jar:libs/*" com.example.demo.DesktopFileSearch

最佳實踐

  1. 版本控制:在 JAR 文件名中包含版本號

  2. 依賴管理

    • 對于簡單項目,使用包含依賴的單一 JAR

    • 對于大型項目,使用 lib 目錄存放依賴

  3. 簽名驗證:使用 jarsigner 對 JAR 進行簽名

    jarsigner -keystore mykeystore.jks -storepass password -keypass password your-app.jar mykey
  4. 瘦身打包:使用 ProGuard 或其它工具減小 JAR 大小

  5. 跨平臺測試:在不同操作系統上測試 JAR 文件

總結打包 Java 應用程序為 JAR 文件是分發和部署的關鍵步驟。選擇適合您項目的打包方法:

  1. 簡單項目:使用 IDE 內置的導出功能

  2. 標準項目:使用 Maven 或 Gradle 構建

  3. 需要依賴管理:使用包含依賴的打包方式

  4. 特殊需求:手動創建 JAR 文件

完成 JAR 打包后,您可以進一步使用 Launch4j 或 jpackage 工具將其轉換為 EXE 文件,創建完整的 Windows 安裝程序。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88098.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88098.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88098.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Starrocks 異常解決】-- mysql flink sync to starrocks row error

1、異常信息 flink 1.20 starrocks 3.3.0 mysql 8.0 errorLog: Error: Target column count: 35 doesnt match source value column count: 28. Column separator: \t, Row delimiter: \n. Row: 2025-05-22 6 23400055 214 dssd 1 1 1928 mm2er 360 20000.00000000 1…

Jenkins 使用宿主機的Docker

背景&#xff1a;不想在Jenkins 內部安裝Docker,想直接使用Jenkins服務所在的系統安裝的docker當你在 Jenkins 中執行 docker 命令時&#xff0c;實際上是通過 Docker 客戶端與 Docker 守護進程進行通信。Docker 客戶端和守護進程之間的通信是通過一個名為 /var/run/docker.soc…

工具+服務雙驅動:創客匠人打造中醫IP差異化競爭力

一、技術工具場景化定制&#xff1a;中醫專業的可視化破圈在中醫IP同質化嚴重的行業現狀下&#xff0c;創客匠人以場景化技術工具破解專業傳播難題。系統內置的“體質測試”模塊可生成個性化調理報告&#xff0c;“案例庫”支持前后對比圖上傳&#xff0c;“直播問診”自動添加…

JVM對象分配內存如何保證線程安全?

大家好&#xff0c;我是鋒哥。今天分享關于【JVM對象分配內存如何保證線程安全&#xff1f;】面試題。希望對大家有幫助&#xff1b; JVM對象分配內存如何保證線程安全&#xff1f; 超硬核AI學習資料&#xff0c;現在永久免費了&#xff01; 在Java中&#xff0c;JVM&#xf…

機器學習中的數據對齊

文章目錄前言數據集怎么理解數據數據對齊為什么偏偏是這樣對齊&#xff1f;前言 在神經網絡中&#xff0c;我們往往會根據數據集構建訓練集、測試集&#xff0c;有時會有驗證集。但是&#xff0c;在構建完成后&#xff0c;如果直接將這些數據直接扔進模型訓練&#xff0c;輸入…

機器學習:更多分類回歸算法之決策樹、SVM、KNN

下面介紹的這幾種算法&#xff0c;既能用于回歸問題又能用于分類問題&#xff0c;接下來了解下吧。 決策樹 可參考&#xff1a; 決策樹&#xff08;Decision Tree&#xff09; | 菜鳥教程 決策樹&#xff08;Decision Tree&#xff09;是一種常用的監督學習算法&#xff0c;可用…

Vue 整合 Vue Flow:從零構建交互式流程圖

目錄引言目的適用場景環境準備基礎組件 (index.vue)自定義組件 (矩形、菱形等)RectangleNode.vue (矩形節點)&#xff1a;DiamondNode.vue (菱形節點)&#xff1a;ImageNode(自定義圖片節點):操作實現 (#操作實現) 拖拽節點 (#拖拽節點) 連線 (多連接點) 刪除節點 …

C# WPF - Prism 學習篇:搭建項目(一)

一、前期準備開發工具&#xff1a;Visual Studio 2022二、創建項目1、創建WPF 應用“WpfApp.StudyDemo”&#xff1a;2、項目結構如下&#xff1a; 三、安裝 Prism1、選中項目“WpfApp.PrismDemo”&#xff0c;在右鍵菜單中選擇“管理 NuGet 程序包(N)...”。2、在搜索框中輸入…

單片機 基于rt-thread 系統 使用 CCM內存

一、開發環境 開發板&#xff1a;野火stm32f407 系統&#xff1a;rt-thread V4.1.1 二、鏈接腳本配置 ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ****************************…

【UnityAssetBundle】AB包卸載資源

AB包的卸載高效穩定游戲開發的強制要求&#xff0c;它解決了資源管理中的內存泄漏問題&#xff0c;為動態的內容加載、熱更新、大型世界的構建提供了內存保障&#xff0c;最終提升了游戲性能、穩定性和用戶體驗。卸載資源方式一&#xff08;推薦使用&#xff09;&#xff1a;卸…

【萬字長文】深度學習2 yolov5修改為自己的數據集

數據預處理 使用labelme可以直接導出適用于yolo模型的txt文本數據&#xff0c;也可以直接導出默認的json數據結構&#xff0c;后面我會提供代碼進行轉換。自行進行標注&#xff0c;圖片與標注一一對應&#xff0c;更多要求不贅述。因為我做最簡單的檢索模型&#xff0c;不做切…

ubuntu18編譯RealSense SDK 2.0

參考文章&#xff1a;https://dev.intelrealsense.com/docs/compiling-librealsense-for-linux-ubuntu-guide1、安裝依賴 sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade sudo apt-get install libssl-dev libusb-1.0-0-dev libud…

算法學習筆記:9.Kruskal 算法——從原理到實戰,涵蓋 LeetCode 與考研 408 例題

在圖論的眾多算法中&#xff0c;Kruskal 算法以其簡潔高效的特性&#xff0c;成為求解最小生成樹&#xff08;Minimum Spanning Tree&#xff0c;MST&#xff09;的經典方法。無論是在通信網絡的優化設計、電路布線的成本控制&#xff0c;還是在計算機考研 408 的備考過程中&am…

Vue+Openlayers加載OSM、加載天地圖

文章目錄1. 介紹2. 加載底圖2.1 加載默認OSM地圖2.2 加載天地圖1. 介紹 Openlayers官網&#xff1a;https://openlayers.org/ 安裝依賴&#xff1a;npm i ol 2. 加載底圖 參考博客&#xff1a; vueopenlayers環境配置&#xff1a;https://blog.csdn.net/cuclife/article/det…

Python處理電子表格文件庫之pyexcel使用詳解

概要 pyexcel是一個功能強大的Python第三方庫,專門用于處理各種格式的電子表格文件。核心價值在于提供了統一的接口來讀取、寫入和操作Excel、CSV、ODS等多種電子表格格式,極大簡化了數據處理工作流程。與傳統的單一格式處理庫不同,pyexcel采用了插件化架構,使開發者能夠通…

【網絡安全】惡意 Python 包“psslib”仿冒 passlib,可導致 Windows 系統關閉

文章目錄惡意 Python 包“psslib”仿冒 passlib如何避免psslib的威脅惡意 Python 包“psslib”仿冒 passlib Socket 的威脅研究團隊發現了一個名為 psslib 的惡意 Python 包&#xff0c;旨在以提供密碼安全功能為幌子突然關閉 Windows 系統。 該軟件包由威脅行為者使用別名 u…

ai之對接電信ds后端服務,通過nginx代理轉發https為http,對外請求,保持到達第三方后請求頭不變

前置環境&#xff1a; 在微信小程序中嵌入H5頁面&#xff08;智能客服&#xff09;&#xff0c;需要讓h5頁面在https的域名服務器上。即通過 nginx 部署成web服務&#xff0c;還得配置域名和端口443訪問。電信的第三方deepseek服務 &#xff0c;只接收http請求&#xff0c;暫未…

第十四節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入門 - Flask 后端 生產部署講解

Vben5 系列文章目錄 ?? 基礎篇 ? 第一節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入門 ? 第二節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入門 - Python Flask 后端開發詳解(附源碼) ? 第三節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入…

Unity開發如何解決iOS閃退問題

一、iOS閃退常見原因及排查方法1. 內存問題&#xff08;最常見原因&#xff09; 癥狀表現&#xff1a; 設備發熱后閃退 加載大型場景時崩潰 控制臺出現EXC_RESOURCE RESOURCE_TYPE_MEMORY日志 解決方案&#xff1a; // 內存監控代碼 void Update() { Debug.Log($"內存使用…

【機器學習筆記 Ⅲ】5 強化學習

強化學習&#xff08;Reinforcement Learning, RL&#xff09; 強化學習是機器學習的一個分支&#xff0c;其核心思想是讓智能體&#xff08;Agent&#xff09;通過與環境&#xff08;Environment&#xff09;的交互學習最優策略&#xff08;Policy&#xff09;&#xff0c;以最…