JDK 11 使用 jlink 生成定制化的 JRE

总所周知,在 jdk8 之后,不再提供默认的 jre,后续如果项目中还是想用 jre 的形式发布软件,那么可以使用 jlink 工具生成 jre。

jdk11 jlink

jlink 命令

jlink [options] --module-path modulepath --add-modules module [, module…]

如果是在 jdk 目录下执行 jlink,那么 modulepath 就是 jdk 目录下的 jmods,下面总共有 71 个模块:

java.base              jdk.internal.le 
java.compiler          jdk.internal.opt 
java.datatransfer      jdk.internal.vm.ci 
java.desktop           jdk.internal.vm.compiler 
java.instrument        jdk.internal.vm.compiler.management 
java.logging           jdk.jartool 
java.management        jdk.javadoc 
java.management.rmi    jdk.jcmd 
java.naming            jdk.jconsole 
java.net.http          jdk.jdeps 
java.prefs             jdk.jdi 
java.rmi               jdk.jdwp.agent 
java.scripting         jdk.jfr 
java.se                jdk.jlink 
java.security.jgss     jdk.jshell 
java.security.sasl     jdk.jsobject 
java.smartcardio       jdk.jstatd 
java.sql               jdk.localedata 
java.sql.rowset        jdk.management.agent 
java.transaction.xa    jdk.management.jfr 
java.xml.crypto        jdk.management 
java.xml               jdk.naming.dns 
jdk.accessibility      jdk.naming.rmi 
jdk.aot                jdk.net 
jdk.attach             jdk.pack 
jdk.charsets           jdk.rmic 
jdk.compiler           jdk.scripting.nashorn 
jdk.crypto.cryptoki    jdk.scripting.nashorn.shell 
jdk.crypto.ec          jdk.sctp 
jdk.crypto.mscapi      jdk.security.auth 
jdk.dynalink           jdk.security.jgss 
jdk.editpad            jdk.unsupported.desktop 
jdk.hotspot.agent      jdk.unsupported 
jdk.httpserver         jdk.xml.dom 
jdk.internal.ed        jdk.zipfs 
jdk.internal.jvmstat 

可以在 jdk 目录下使用以下命令生成 jre

bin\jlink --module-path jmods --add-modules java.base,java.desktop --output myjre

生成后,使用 myjre\bin\java --list-modules 来查看 jre 中添加的模块。

NoClassDefFound

如果在使用自定义的 jre 运行 java 程序时,出现 NoClassDefFound 错误,说明,jre 中没有添加相关的模块。

首先,需要确定缺少的 class 存在于那个 jdk module 中,然后在 jlink 命令中添加到 --add-modules 列表中,重新生成 jre 就可以了。

你可能感兴趣的:(Java)