我有一个旧版本的jar,现在我想用jlink生成一个更小的jre,怎么办?

I have a old version jar,now I want to use jlink to generate a smaller jre,how to do it?

我有一个 java 应用程序使用 java8 和 maven,现在我想使用 jdk9 生成一个较小的 jre 来打包我的应用程序,怎么办? 如果不行,能给我一个maven用jlink生成jre的小demo吗?我英文不太好,sorry and thanks.

你可以use JDeps to analyze your dependencies on modules:

jdeps -summary -recursive --class-path $libs $jar

$libs 替换为您的所有依赖项(甚至是可传递的依赖项;Maven can copy them)并将 $jar 替换为您的应用程序 JAR。然后输出包含模块依赖项列表(查找 ... -> java.*... -> jdk.*)。

如果您在 Linux,您可以使用此管道获取模块名称的排序列表:

jdeps -summary -recursive --class-path 'jars/*' jars/app.jar
    | grep '\-> java.\|\-> jdk.'
    | sed 's/^.*-> //'
    | sort -u

如果您使用的是 Java 10 或更高版本,则可以使用 --print-module-deps 而不是 -summary

获取该列表并将其输入 jlink:

jlink
    --module-path $jdk/jmods
    --add-modules $modules
    --output minimal-jre

如果你也想绑定所有平台服务,丢一个--bind-services.

下面一行将列出您确定的所有模块以及它们的依赖项,也许还有它们绑定的服务:

minimal-jre/bin/java --list-modules