文章目录

  • 将代码打成jar包
  • 准备工作
  • 下载exe4j
  • 定制jre
  • 检测jar包用到jre的哪些jmods
  • 生成jre
  • 准备exe图标
  • 使用exe4j将jar转换成exe程序


将代码打成jar包

打jar之前,把那些用不到的依赖统统删除,以免包含一些无用的内容,比如用不上的一些依赖jar,Test【moudle】依赖的一些库,如junit等

  1. Project Structure-Artifacts-添加-jar-From modules with dependenies
  2. 配置module
  • 选择Module,一般我们只需要项目的main【module】,不需要test【module】
  • 选择Main Class,也就是程序的入口类
  • 选择META-INF生成目录的位置,这里注意了,只需要到src或者main【其他位置试过了,打出的jar没有东西】
  1. 配置资源目录
  • 我们看到,这里并没有resource目录,可能是idea版本问题,这里不手动添加resource目录的话,打出的jar包找不到资源文件

javafx 打包 jar javafx 打包大小_jar包

  • 点击+号,添加Directory Content - 选择项目的resource文件夹添加进来
  1. 生成jar包
  • Build - Build Artifacts - build
  • 在项目目录下会生成一个out文件夹,生成的jar就在里面
  1. 测试jar是否可用
  2. javafx 打包 jar javafx 打包大小_exe打包_02


  • 选中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

javafx 打包 jar javafx 打包大小_javafx_03


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
  • javafx 打包 jar javafx 打包大小_exe打包_04

  • 这里检测出我的jar包用到了五个模块的内容
    java.base
    java.desktop
    java.xml
    javafx.base
    jdk.unsupported
    分别对应jdk - jmods下面的模块
  • javafx 打包 jar javafx 打包大小_javafx 打包 jar_05

  • 也就是说,我们定制的jre,只要包含这五个模块就行了

等等,jdk中有javafx.base.jmod吗?没有!jdk11已经把javaFx独立出去了,在项目中我们直接引入javafx包就行了,但是我还是有个不明白的地方,我的项目明明用到了javafx.base.jar,javafx.controls.jar,javafx.graphics.jar,为啥只检测出javafx.base呢?

javafx 打包 jar javafx 打包大小_jar_06


不管他了,反正不影响我打包,也就是说,我只要导出4个jmods就行了

生成jre

输入命令:

jlink --module-path jmods --add-modules java.base,java.desktop,java.xml,jdk.unsupported --output myjre

javafx 打包 jar javafx 打包大小_javafx_07


在当前目录下生成myjre

javafx 打包 jar javafx 打包大小_javafx 打包 jar_08


将这个myjre移动到我们前面建的ttt文件夹备用

准备exe图标

要ico格式的,提供一个在线生成ico图标的地址
http://pdftoword.55.la/img2icon/

使用exe4j将jar转换成exe程序

经过上面的准备工作,得到这三个东西就可以继续exe打包的工作了

javafx 打包 jar javafx 打包大小_jar包_09


运行exe4j,开始打包

如果有奇怪的报错,把刚才生成的jre删掉就行了,大概率是生成的jre或者之前有存在的jre有问题

javafx 打包 jar javafx 打包大小_jar包_10


javafx 打包 jar javafx 打包大小_jar包_11


javafx 打包 jar javafx 打包大小_javafx_12


javafx 打包 jar javafx 打包大小_jar包_13


高级选项这里进去后,勾选64位选项后返回到当前界面【连续返回好几次】,然后 - Next

javafx 打包 jar javafx 打包大小_jar包_14


javafx 打包 jar javafx 打包大小_javafx 打包 jar_15


javafx 打包 jar javafx 打包大小_jar_16


javafx 打包 jar javafx 打包大小_javafx_17


javafx 打包 jar javafx 打包大小_jar_18


javafx 打包 jar javafx 打包大小_jar包_19


javafx 打包 jar javafx 打包大小_jar_20


javafx 打包 jar javafx 打包大小_javafx 打包 jar_21


启动或者退出,之后会弹一个保存配置的对话框,随你到此,exe打包就完成了

javafx 打包 jar javafx 打包大小_jar_22


不出意外的话,这个exe程序在你电脑上运行时没有问题的,发给别人就跑不起来,这里有两个东西要注意下

  1. 发给别人时,不能只发exe文件,还要连同myjre一起发过去,也就是将myjre和exe文件打成一个压缩包传给别人
  2. myjre只是jdk定制的jre,里面包含了jdk的一些工具库,但是并没有包含javafx的工具啊,所以还要把javafx-sdk里的bin复制到myjre/bin下,当然,大部分的文件是相同的,直接跳过就行,这样传给别人,就能跑起来了

还有一个,如果你的程序没有用到webkit和媒体相关的api,下面这两个不复制过去也是ok的

javafx 打包 jar javafx 打包大小_javafx 打包 jar_23


我没有复制这两个东西,程序跑起来是没问题的。