我正在创建一个带有3个模块user
,dept
和account
的示例应用程序。在我的用户模块中,我有一个主类,并使用以下命令编译我的模块:
javac -d target --module-source-path src $(find -name "*.java")
编译后,执行以下命令运行:
java -p target -m com.user/com.user.info.Launcher
运行Java模块后的输出成功。但是,当尝试使用
jlink
创建运行时镜像时,该镜像创建成功,但是模块可执行脚本不存在。为了创建图像,我使用以下命令:jlink --module-path $JAVA_HOME/jmods:target --add-modules com.user --output my-app
在运行时镜像中,我有
bin
目录,但是此目录仅包含java
和keynote
脚本。我期望用户主类脚本也能执行我的应用程序。我的Java版本如下:
java version "9-ea"
Java(TM) SE Runtime Environment (build 9-ea+165)
Java HotSpot(TM) 64-Bit Server VM (build 9-ea+165, mixed mode)
我该如何解决这个问题?
最佳答案
jlink
创建一个运行时VM镜像,其中仅包含所需的模块。
由于您指定了--add-modules com.user
,因此图像将包括com.user
模块及其(直接或间接)依赖的所有模块。
您可以通过使用生成的图像的java
文件夹中的bin
二进制文件并使用以下命令来运行您的应用程序:
java com.user.info.Launcher
您还可以使用
jlink
选项让--launcher <command>=<module>/<main>
生成启动器脚本。在您的情况下,您可以执行以下操作:jlink --module-path $JAVA_HOME/jmods:target --add-modules com.user --output my-app --launcher launch=com.user/com.user.info.Launcher
然后,您可以只使用
launch
目录中的bin
来运行该应用程序。