javaFx打包exe程序

  • Post author:
  • Post category:java




将代码打成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包找不到资源文件

在这里插入图片描述

  • 点击+号,添加Directory Content – 选择项目的resource文件夹添加进来

    在这里插入图片描述
  1. 生成jar包

    在这里插入图片描述
  • Build – Build Artifacts – build
  • 在项目目录下会生成一个out文件夹,生成的jar就在里面
  1. 测试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/



使用exe4j将jar转换成exe程序

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

在这里插入图片描述

运行exe4j,开始打包

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

启动或者退出,之后会弹一个保存配置的对话框,随你

到此,exe打包就完成了

在这里插入图片描述

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

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

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

在这里插入图片描述

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



版权声明:本文为Jhone_csdn原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。