文章目录
- 将代码打成jar包
- 准备工作
- 下载exe4j
- 定制jre
- 检测jar包用到jre的哪些jmods
- 生成jre
- 准备exe图标
- 使用exe4j将jar转换成exe程序
将代码打成jar包
打jar之前,把那些用不到的依赖统统删除,以免包含一些无用的内容,比如用不上的一些依赖jar,Test【moudle】依赖的一些库,如junit等
- Project Structure-Artifacts-添加-jar-From modules with dependenies
- 配置module
- 选择Module,一般我们只需要项目的main【module】,不需要test【module】
- 选择Main Class,也就是程序的入口类
- 选择META-INF生成目录的位置,这里注意了,只需要到src或者main【其他位置试过了,打出的jar没有东西】
- 配置资源目录
- 我们看到,这里并没有resource目录,可能是idea版本问题,这里不手动添加resource目录的话,打出的jar包找不到资源文件
- 点击+号,添加Directory Content - 选择项目的resource文件夹添加进来
- 生成jar包
- Build - Build Artifacts - build
- 在项目目录下会生成一个out文件夹,生成的jar就在里面
- 测试jar是否可用
- 选中jar包,右键 - Open in Terminal
- 注意了,每次Open in Terminal都会打开一个终端,记得在下次打包前要关闭,否则文件被占用,新打包的jar无法覆盖,会出错
- 在终端输入命令 java -jar + 【Tab】,如果jar包正常运行,则成功
- 将jar包拷贝一份,比如放到G:\ttt\xxx.jar,后面我们将所有和打包相关的东西都放ttt文件夹
下载exe4j
https://exe4j.apponic.com/download/
- 通过 exe4j将jar包装成exe可执行文件
- 下载后安装【傻瓜式安装】
- 安装完成后记得一定要注册,否则打出的exe程序会报异常
This executable was created with an evaluation version of exe4j
Name和Company随便填
注册码选一个即可:
A-XVK258563F-1p4lv7mg7sav
A-XVK209982F-1y0i3h4ywx2h1
A-XVK267351F-dpurrhnyarva
A-XVK204432F-1kkoilo1jy2h3r
A-XVK246130F-1l7msieqiwqnq
A-XVK249554F-pllh351kcke50
A-XVK238729F-25yn13iea25i
A-XVK222711F-134h5ta8yxbm0
A-XVK275016F-15wjjcbn4tpj
A-XVK275016F-15wjjcbn4tpj
定制jre
在这之前,我们先来思考一下,我们的jar包只包含了我们自己写的一些代码,它是如何在widows系统中运行起来的呢?那是因为我们电脑上已经安装的jdk,而jdk包含了jre环境,我们的程序是给别人用的,被人的电脑上可不一定有jre环境,所以,我们要将jre打包进exe程序
- 在jdk1.8之前,jre是直接提供给我们的,由于包含了很多我们用不上的代码,导致生成的exe程序很大
- 在jdk11及以后的版本,采用了模块化的做法,也就是Jmods,把原来的jdk分成各个jmods,jre需要自己生成,定制jre的时候,用到什么模块,就导入哪个模块
- 关于jdk11及往后版本收费的问题,业内你一句我一句的,我是没整明白到底收不收费,反正我是这么认为的,开发的软件没几个人用,用啥版本他也懒得管,不过我有一个疑问,既然OpenJDK免费,为啥大家还是在用oracle家的JDK呢?
检测jar包用到jre的哪些jmods
在cmd等终端中输入命令:
jdeps --module-path "F:\javafx\SDK\javafx-sdk-11.0.2\lib" --list-deps G:\ttt\NoteStudio.main.jar
- “F:\javafx\SDK\javafx-sdk-11.0.2\lib” 指的是你项目依赖的jar包,这些jar包可能也会依赖jmods
- 这里检测出我的jar包用到了五个模块的内容
java.base
java.desktop
java.xml
javafx.base
jdk.unsupported
分别对应jdk - jmods下面的模块 - 也就是说,我们定制的jre,只要包含这五个模块就行了
等等,jdk中有javafx.base.jmod吗?没有!jdk11已经把javaFx独立出去了,在项目中我们直接引入javafx包就行了,但是我还是有个不明白的地方,我的项目明明用到了javafx.base.jar,javafx.controls.jar,javafx.graphics.jar,为啥只检测出javafx.base呢?
不管他了,反正不影响我打包,也就是说,我只要导出4个jmods就行了
生成jre
输入命令:
jlink --module-path jmods --add-modules java.base,java.desktop,java.xml,jdk.unsupported --output myjre
在当前目录下生成myjre
将这个myjre移动到我们前面建的ttt文件夹备用
准备exe图标
要ico格式的,提供一个在线生成ico图标的地址
http://pdftoword.55.la/img2icon/
经过上面的准备工作,得到这三个东西就可以继续exe打包的工作了
运行exe4j,开始打包
如果有奇怪的报错,把刚才生成的jre删掉就行了,大概率是生成的jre或者之前有存在的jre有问题
高级选项这里进去后,勾选64位选项后返回到当前界面【连续返回好几次】,然后 - Next
启动或者退出,之后会弹一个保存配置的对话框,随你到此,exe打包就完成了
不出意外的话,这个exe程序在你电脑上运行时没有问题的,发给别人就跑不起来,这里有两个东西要注意下
- 发给别人时,不能只发exe文件,还要连同myjre一起发过去,也就是将myjre和exe文件打成一个压缩包传给别人
- myjre只是jdk定制的jre,里面包含了jdk的一些工具库,但是并没有包含javafx的工具啊,所以还要把javafx-sdk里的bin复制到myjre/bin下,当然,大部分的文件是相同的,直接跳过就行,这样传给别人,就能跑起来了
还有一个,如果你的程序没有用到webkit和媒体相关的api,下面这两个不复制过去也是ok的
我没有复制这两个东西,程序跑起来是没问题的。