jlink JRE能否与外部JAR文件一起使用?

3
Java中的jlink功能允许您为应用程序创建一个单独的运行时环境。通常,jlink会将此应用程序所需的所有模块都压缩到一个名为“modules”的大型文件中。
我想知道是否有一种方法可以忽略一些模块,以便它们成为单独的jar文件,但是jlink仍然能够找到它们并运行应用程序。是否有这样做的方法?
其中一个用例是如果您正在处理LGPL库。您可能希望将LGPL库留在模块集之外,作为单独的jar文件,以便想要交换jar文件的人可以(这是LGPL所要求的)。
Jlink具有“requires static”语句,可用于要求可选模块。我认为使用此功能可能有用,但我遇到了问题。
当我使用requires static编译项目时,我可以通过使用java的“--add-modules”开关来包含模块来运行它。但是,一旦我对其运行jlink以创建自定义映像,我就无法使其工作。
当我尝试运行已链接的项目时,我会得到ClassNotFound异常。
当您在项目上运行jlink时,它会创建一个定制的运行时图像。该项目的所有主要模块都放入名为“modules”的映像文件中。我使用jimage命令检查了此映像文件,并确认该映像文件不包含我声明为静态的模块。
使用jlink,我已经尝试将声明为静态的模块的jar文件放入带有模块图像的目录中。然后,我尝试使用“--add-modules”手动添加模块,以及使用-p和-cp指定具有jar的目录,但我仍然会遇到ClassNotFound异常。
1个回答

4

好的,我在发布后不久回答了自己的问题。

我学到了两件事:

  1. 在创建 jlink 运行时镜像后,你的独立 jar 包(需要静态模块)不能放在 libs 目录与 jlink 镜像一起。

换句话说,运行 jlink 后,你会得到这样一个目录结构: bin conf include legal lib

lib 文件夹是存储运行时镜像的地方。我把我的独立 jar 包放在 lib 文件夹里,但这样做不起作用。如果你把它们放在一个单独的目录中,就可以正常工作。

  1. "-add-modules" 开关必须放在 -m 命令之前运行镜像的序列中。

运行图像的最终命令可能像这样:

java --add-modules org.example.module.here,org.example.another.module.here -p your_jar_directory_here -m your.main.module/your.package.here.Main

这对我有用。你必须给 add-modules 开关提供包含你静态添加的模块的模块,并且 -p 开关需要给出包含那些模块的 jar 的目录路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接