如何创建包含外部JAR包的Java可执行JAR文件?
打包含外部依赖的Java应用为单个JAR文件(用于转换为可执行文件)
我正在开发一个依赖JFreeCharts和JCommon等外部JAR包的Java应用,目前全程通过命令行完成编译与运行,具体命令如下:
当前编译命令
javac -d build\classes -cp ".;build\\resources\\jfreechart-1.0.1.jar;build\\resources\\jcommon-1.0.0.jar" @files_info.txt
当前运行命令
进入build\classes目录后执行:
java -cp ".;..\\resources\\jfreechart-1.0.1.jar;..\\resources\\jcommon-1.0.0.jar" app @classes_info.txt
需求
现在我希望将该应用打包成单个JAR文件,后续用于转换成可执行文件。
无外部依赖时的打包方式
之前开发不含外部库的应用时,我会进入build\classes目录,通过以下命令生成并运行JAR:
# 生成JAR(需提前创建manifest.txt指定主类) jar cvfm ..\app.jar manifest.txt *.class # 运行JAR java -jar ..\app.jar
注意:我未使用任何IDE,全程通过命令行完成编译、运行及打包操作。
解决方案:构建包含依赖的胖JAR
要打包单个包含所有外部依赖的JAR,可按以下步骤操作:
- 解压外部依赖JAR到临时目录
在项目根目录下创建临时文件夹,将依赖JAR解压进去:
mkdir temp_lib cd temp_lib jar xf ../build/resources/jfreechart-1.0.1.jar jar xf ../build/resources/jcommon-1.0.0.jar
- 将依赖文件复制到编译后的类目录
把临时目录中的所有文件复制到build\classes目录,覆盖重复文件(通常不会有冲突):
xcopy /E /Y * ../build/classes/
- 创建MANIFEST.MF文件
进入build\classes目录,创建manifest.txt文件,内容如下(替换app为你的实际主类名):
Manifest-Version: 1.0 Main-Class: app
- 打包成单个JAR
在build\classes目录执行打包命令:
jar cvfm ../app.jar manifest.txt *
完成后,生成的app.jar就是包含所有依赖的可独立运行的JAR文件,直接用java -jar app.jar即可运行,之后就可以用Launch4j将其转换为可执行文件。
内容的提问来源于stack exchange,提问作者Aman
相关产品推荐
相关产品推荐

