使⽤jpackage将java程序打包成exe程序(不需要安装jdk即可运⾏)
前⾔
突然想到把java打包成windows上可以运⾏的程序,于是乎,在搜索引擎和各路博客以及官⽅⽂档的帮助下,终于实现了⽬标,虽然不算完美,但在这个过程中对maven打包过
程,jdk打包jar的理解加深。
maven只是更⽅便的帮助我们打包的⼯具,于是开始尝试直接使⽤jdk打包。
接着尝试使⽤maven打包,再使⽤jpackage打包成exe安装包。
然后⼜希望打包成绿⾊版的exe(就是⽆需安装直接运⾏的),结果打包完发现⽂件太⼤,⽽且每次修改都要打包,时间太长。
尝试直接使⽤编译好的class运⾏java程序,修改完类就可以直接替换,⽆需打jar包和再次转成exe。
过程中⼜发现jpackage打包的整个⽂件有很多重复的dll⽂件,⼜发现了runtime⽂件夹。
想到使⽤jre可以直接运⾏java程序,⼜发现这些dll和jre中的⽂件⾼度重合,于是想到直接将jre和class直
接打包到⼀起,使⽤脚本命令来启动java程序。thinkphp6面门
这样⼜使整个运⾏所需的⽂件夹⼤⼩直接减⼩了⼏⼗MB,打包⽂件从最开始的200+MB,最终缩⼩到了 70MB,哎,就是玩⼉。
1.安装wix 3.XX
下载⼆进制包(wix311-binaries.zip)解压并添加根⽬录路径到环境变量path中(D:\Program\openjdk\wix)
2.打包成便携执⾏程序()
⽬录结构
在空⽩处按住shift,单击右键,选择“在此处打开powershell窗⼝”
执⾏
.\jdk-14.0.1\bin\jpackage -i .\planewar --type app-image -n planewar --main-jar .\planewar\plane-war-1.0-SNAPSHOT.jar --vendor cy --verbose --win-console
选项说明:
# -i: 存放待打包资源的⽂件夹
# -type: win下默认是exe,其他的有msi、app-image
# -n: 打包后的程序名称
# --main-jar 包含启动类(main)的jar包,如果jar包不是可执⾏的jar,则需要⼿动指定主类
# --main-class ⼿动指定主类,例如: --AppMain
# --vendor 供应商信息(随便填)
# --verbose 显⽰打包过程
# --win-console 添加控制台输出
3.打包成安装程序
将需要打包的资源放进⽂件夹planewar
执⾏打包
.\jdk-14.0.1\bin\jpackage -i .\planewar -n planewar --main-jar .\planewar\plane-war-1.0-SNAPSHOT.jar --vendor cy --verbose --win-console --win-dir-chooser --win-shortcut
选项说明:
# -i 表⽰输⼊⽂件夹
# -n 表⽰应⽤名称
# --main-jar 指定jar包,需要jar已经指定main类,否则需要添加--main-class⼿动指定,如:--main-class com.demo.DemoApplication
# --vendor 发⾏商信息
# --verbose 显⽰打包执⾏过程
# --win-console 使⽤控制台输出
# --win-dir-chooser 选择安装位置
# --win-shortcut 创建快捷⽅式
java下载过程#其他的选项如下:
# –win-dir-chooser, 安装时添加 “选择安装路路径”
# –win-shortcut, 安装后⾃动在桌⾯添加快捷键
buffermode 属性# –win-menu-group, 启动该应⽤程序所在的菜单组 (实测⽆效,但是必须有这条命令,没有–win-menu 会报311错误)encryption怎么读
# -update 2021-2-18: –win-menu-group 应该放在–win-menu 之后,否则⽆效。
# –win-menu,添加到系统菜单中
# ⽰例:jpackage --name Non-modular-installer --input lib --main-class com.raven.App --main-jar Non-modular-packaging-demo.jar --vendor raven --win-dir-chooser --win-shortcut --win-menu --win-menu-group "Non-modular-packaging 4.在便携包(步骤2或其他类型包的安装⽬录)的基础上直接使⽤类运⾏程序,不使⽤jar包
4.1 打开"软件⽬录(或安装⽬录)/app"⽂件夹
4.2 使⽤⽂本编辑器打开"软件名.cfg"(例如:PlaneWar.cfg)⽂件并修改
修改前
[Application]
app.name=PlaneWar
app.version=1.0
app.runtime=$ROOTDIR\runtime
app.identifier=com.game
app.classpath=$ROOTDIR\app\.\plane-war-1.0-SNAPSHOT.jar;$ROOTDIR\app\plane-war-1.0-SNAPSHOT.jar
app.mainjar=$ROOTDIR\app\plane-war-1.0-SNAPSHOT.jar
app.mainclass=com.game.World
[JavaOptions]
高效办理的编程培训课程[ArgOptions]
修改后:
删除了"app.mainjar"项
修改"app.classpath"为app⽂件所在路径(即cfg⽂件夹路径),其他保持不变
[Application]
app.name=PlaneWar
app.version=1.0
app.runtime=$ROOTDIR\runtime
app.identifier=com.game
app.classpath=$ROOTDIR\app
app.mainclass=com.game.World
[JavaOptions]
[ArgOptions]
5.直接使⽤windows的bat脚本或linux脚本运⾏java程序(⾃带运⾏环境)
5.1 将java代码相关资源放⼊app⽂件夹
5.2 ⽣成jre运⾏环境(注意jdk版本需要和代码版本⼀致,否则可能会出错)
进⼊jdk根⽬录
输⼊(如果失败,尝试使⽤管理员⾝份启动powershell,再执⾏该命令)
--module-path jmods --add-modules java.desktop --output jre
⽣成后的jre⽂件夹如图
5.3 powershell⼿动执⾏命令验证是否成功
jre\bin\java --class-path "..\planewar\PlaneWar\app\.;..\planewar\PlaneWar\app\lib\*" com.game.GameLaunch 说明:
# 成功表⽰可以运⾏
# jar路径windows使⽤";"分割,linux使⽤":"
fedora系统优缺点# "..\planewar\PlaneWar\app\."表⽰class⽂件的根⽬录
# "..\planewar\PlaneWar\app\lib\*"表⽰加载lib中所有的jar⽂件
5.4
创建⼀个新⽂件夹
将jre⽂件夹和app⽂件夹移⼊新⽂件夹中
根据你的系统选择下列⼀种即可
Windows:
创建⽂本⽂件,重命名为run.bat,内容输⼊:
jre\bin\java --class-path "app\.;app\lib\*" com.game.GameLaunch
Linux:
创建⽂本⽂件,重命名为run.sh,内容输⼊:
jre\bin\java --class-path "app\.:app\lib\*" com.game.GameLaunch
5.5 运⾏脚本,成功即完成。
参考:
blog.csdn/qq_38373149/article/details/115201261
blog.csdn/yiminghd2861/article/details/108286956
以及其他博客(写的时候没记录下⽹址)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论