如何将 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;以最…