java精简jre打包(jdk14、15)

自己也搭建了个新的博客,部分文章与同步.本文在我的新博客同样可以看到:/

在此之前,我曾经写过Java 精简Jre, 。这个是jdk8版本的精简,但是jdk8版本的精简非常繁琐,而且精简后部分电脑是运行不了的,还会出很多问题。

我那时候就觉得为什么甲骨文官方不出exe打包工具,主要是有些gui小工具我是用java写的,我总不可能带那么大的jre到对方电脑去吧。我问过很多老师,他们给我的答案都是让客户自己去装个jdk.....

1.jdeps

我们的第一步就是用jdeps,查看jar包的依赖,比如:

jdeps E:MyjavaProjectfinishedProductFXMusicPlayerFXMusicPlayer.jar

如果你用了javafx,(javafx在jdk11后分离,我们大部分打包的java程序很多时候不是swing就是javafx这种gui程序),你得指定第三方模块的路径,不然会报错:

jdeps --module-path H:JDKopenjfxjavafx-sdk-15.0.1lib --add-modules javafx.base E:MyjavaProjectfinishedProductFXMusicPlayerFXMusicPlayer.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 %~dp0binjavaw.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打包成安装包就行了。

经验分享 程序员 微信小程序 职场和发展