前言
将 java 程序打包成可执行文件或分发包的方式,取决于你的项目类型(普通 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
创建 manifest.mf 文件用于指定主类(可执行 jar 必需),在
classes目录下创建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>执行打包命令
bash
mvn clean package
打包结果在
target目录下:myapp-1.0-snapshot.jar:仅包含项目自身代码的 jarmyapp-1.0-snapshot-jar-with-dependencies.jar:包含所有依赖的可执行 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' // 用于生成可执行脚本 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' }执行打包命令
bash
# 生成包含依赖的 fat jar gradle shadowjar # 或生成可执行脚本(windows 为 .bat,linux 为 .sh) gradle installdist
运行打包结果
- fat jar:
java -jar build/libs/myapp-1.0-all.jar - 可执行脚本:
build/install/myapp/bin/myapp(linux)或build/install/myapp/bin/myapp.bat(windows)
- fat jar:
四、打包成 exe 或原生应用(适合 windows 桌面程序)
如果需要将 java 程序打包成 windows 可执行文件(.exe),可使用第三方工具:
launch4j
- 功能:将 jar 包包装成 exe,支持指定 jre 版本、图标等。
- 步骤:
- 下载 launch4j 并安装
- 配置「input file」为你的 jar 路径,「output file」为生成的 exe 路径
- 配置「jre」选项(如最小版本),点击「build wrapper」生成 exe
excelsior jet
- 功能:将 java 字节码编译为原生机器码(.exe),不依赖 jre,启动更快。
- 适合商业项目(免费版有功能限制)。
五、打包注意事项
依赖管理
- 简单项目:手动复制依赖 jar 到指定目录,运行时通过
-cp指定类路径。 - 复杂项目:优先使用 maven/gradle 的 fat jar 功能,避免依赖缺失。
- 简单项目:手动复制依赖 jar 到指定目录,运行时通过
主类指定
- 可执行 jar 必须在 manifest.mf 中指定
main-class,否则需通过java -cp jar包 主类名运行。
- 可执行 jar 必须在 manifest.mf 中指定
jre 依赖
- 打包后的 jar 或 exe 仍需目标机器安装对应版本的 jre(除非使用 excelsior jet 等工具编译为原生代码)。
资源文件
- 确保项目中的资源文件(如配置文件、图片)被正确打包到 jar 中,读取时使用
getclass().getresourceasstream()方法。
- 确保项目中的资源文件(如配置文件、图片)被正确打包到 jar 中,读取时使用
根据项目复杂度选择合适的方法:简单项目用 jar 命令,依赖较多的项目用 maven/gradle,需原生 exe 则用 launch4j 等工具。
到此这篇关于java程序打包常见几种方式(maven/gradle/ 手动打包)的文章就介绍到这了,更多相关java程序打包内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论