将代码打成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/
    
   
    
    
    使用exe4j将jar转换成exe程序
   
    经过上面的准备工作,得到这三个东西就可以继续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的
    
    
    
    我没有复制这两个东西,程序跑起来是没问题的。
   
 
