如何运行JDK 9 jlink生成的图像?

cla*_*lay 13 java jlink java-platform-module-system java-9

我在这里关注Jigsaw 快速入门.我成功运行了jlink给出的命令:

jlink --module-path $JAVA_HOME/jmods:mlib --add-modules com.greetings --output greetingsapp
Run Code Online (Sandbox Code Playgroud)

这会生成一个"运行时映像",它是一个展开的目录结构,如下所示:

~ tree -d greetingsapp
greetingsapp
??? bin
??? conf
?   ??? security
?       ??? policy
?           ??? limited
?           ??? unlimited
??? include
?   ??? darwin
??? legal
?   ??? java.base
??? lib
    ??? jli
    ??? security
    ??? server
Run Code Online (Sandbox Code Playgroud)

我该怎么办?我期待一个二进制可执行文件,而不是一个展开的目录树.

bin目录有一个java和一个keytool.我没有看到任何.jar文件或.class文件通过捆绑的java可执行文件运行.

Nam*_*man 11

要运行,请执行以下操作:

greetingsapp/bin/java -m com.greetings/com.greetings.Main 
Run Code Online (Sandbox Code Playgroud)

或者,您可以让jlink构建一个执行此操作的启动器脚本

jlink --module-path $JAVA_HOME/jmods:mlib --add-modules com.greetings --output greetingsapp --launcher launch=com.greetings/com.greetings.Main
Run Code Online (Sandbox Code Playgroud)

然后运行:

greetingsapp/bin/launcher
Run Code Online (Sandbox Code Playgroud)

形成相同的文件: -

$ java -p mods -m com.greetings/com.greetings.Main
Run Code Online (Sandbox Code Playgroud)

可以执行以Main从模块结构运行类而不使用链接jshell.


此外, jlink是链接器工具,可用于链接一组模块及其传递依赖项,以创建称为模块化运行时映像的自定义模块化运行时映像,可以使用Java 9模块引入的JMOD工具来完成.正如评论中所指出的那样,如果您只是打算执行主类,那么@Jorn会回答.

您可以使用生成的映像的bin文件夹中的java二进制文件运行应用程序,并使用以下命令:

java com.greetings.Main
Run Code Online (Sandbox Code Playgroud)

另一方面,创建要用作模块的JMOD文件的示例如下:

jmod create --class-path mods/com.greetings --cmds commands
  --config configfiles --header-files src/h --libs lib
  --main-class com.greetings.Main --man-pages man --module-version 1.0
  --os-arch "x86_x64" --os-name "Mac OS X"
  --os-version "10.10.5" greetingsmod 
Run Code Online (Sandbox Code Playgroud)

编辑:扩展+澄清得到我正在寻找的答案.