自己也搭建了个新的博客,部分文章与csdn同步.本文在我的新博客同样可以看到:http://spzgczyj.top/blog/
在此之前,我曾经写过Java 精简Jre,Java 精简Jre_水瓶座鬼才的博客-CSDN博客_java jre 。这个是jdk8版本的精简,但是jdk8版本的精简非常繁琐,而且精简后部分电脑是运行不了的,还会出很多问题。
我那时候就觉得为什么甲骨文官方不出exe打包工具,主要是有些gui小工具我是用java写的,我总不可能带那么大的jre到对方电脑去吧。我问过很多老师,他们给我的答案都是让客户自己去装个jdk.....
我当时就不信,在我有生之年等不到java出打包工具那天,结果没过几年,jdk14和jdk15出来了。我一直在关注jdk新版本的特性,这回我看到了打包工具(孵化阶段)创建一个用于打包独立 Java 应用程序的工具。我当时就很高兴,但是用了后发现并没有我期望的那么好,不过我改进了方法,终于总结出了一个比较可靠的java程序打包方法,主要针对jdk14和jdk15的。
1.jdeps
我们的第一步就是用jdeps,查看jar包的依赖,比如:
jdeps E:\MyjavaProject\finishedProduct\FXMusicPlayer\FXMusicPlayer.jar
如果你用了javafx,(javafx在jdk11后分离,我们大部分打包的java程序很多时候不是swing就是javafx这种gui程序),你得指定第三方模块的路径,不然会报错:
jdeps --module-path H:\JDK\openjfx\javafx-sdk-15.0.1\lib --add-modules javafx.base E:\MyjavaProject\finishedProduct\FXMusicPlayer\FXMusicPlayer.jar
然后我们可以看到这个,主要看右边有那些模块,这里有java.base,java.desktop等等。
2. jlink
一般常用的模块导出即可,建议出现在右边的那些全部导出,导出的指令示例:
jlink --strip-debug --compress 1 --no-header-files --no-man-pages --output miniJre --add-modules java.base,java.logging,java.naming,java.xml,jdk.sctp,jdk.unsupported,java.desktop,java.sql,jdk.charsets,java.net.http,jdk.xml.dom,jdk.jsobject,jdk.jfr,jdk.net,java.rmi,jdk.crypto.ec,jdk.nio.mapmode
比较重要的:java.base,java.logging,java.naming,java.xml,jdk.sctp,jdk.unsupported,java.desktop
这里提醒一下,如果你的项目用到了https,请导出jdk.crypto.ec,因为你不导出这个就会出现
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
链接握手异常,java.net.http和jdk.net也建议导出。
3. 编写批处理脚本
导出后你就可以在当前文件夹下找到个miniJre的文件夹了,这个就是导出的jre,一般就60mb,你可以删除里面的legal文件夹,conf,bin,lib不能删除!然后你可以把你的jar包当到这个文件夹下,写批处理用相对路径的jre运行,也可以解压jar包,我是解压jar包然后写批处理运行,我的bat脚本是:
start /b %~dp0bin\javaw.exe -splash:images/center/loading.gif -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Dfile.encoding=utf-8 cn.gxust.MainRunApp
-splash是指定启动java程序时的启动动画,我用了一个gif,这个你可以删掉,
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
这个是我想用jdk14、jdk15的zgc,这个新gc比cms强,就是看准了这个新的gc强悍的回收效率我才选择了jdk15。起码让我的javafx程序少了300mb的运行内存。
最后程序的结构:
bin、lib、conf是jre的主体,总共就52.3mb,最后94.4mb那是因为我jar解压45mb,毕竟我加了javafx依赖,还有很多杂七杂八的第三方库,还有大把的jpg,主要是图片太多了,占多容量。
4. 打包java程序
最后把这个整个文件夹用innosetup打包成安装包就行了。