Java中的jlink功能允许您为应用创建单独的运行时环境。通常,此应用程序所需的所有模块都由jlink压缩为一个大的“模块”文件。

我感兴趣的是找出是否有一种方法可以省去一些模块,以便它们是独立的jar文件,但jlink可以找到它们并仍然运行应用程序。有没有办法做到这一点?

例如,这是一个用例,如果您正在处理LGPL库。您可能希望将LGPL库从巨大的模块“ blob”中剔除,并将其作为单独的jar保留,以便希望将jar换成其他版本/调整后的版本的人可以使用(LGPL要求) 。

Jlink有一个“需要静态”语句,您可以使用它来要求一个可选模块。我认为使用此功能可能会奏效,但与此同时我遇到了问题。

当我使用require编译项目时,可以通过使用Java的“ --add-modules”开关包含模块来运行它。但是,一旦在其上运行jlink以创建自定义图像,我将无法使其正常工作。

当我尝试运行链接的项目时,出现ClassNotFound异常。

在项目上运行jlink时,它将创建一个自定义运行时映像。项目的所有主要模块都放在一个名为模块的映像文件中。我已经使用jimage命令检查了此图像文件,并且已经确认theis图像文件不包含我声明为静态的模块。

使用jlink,我尝试将静态声明的模块中的jar文件放入带有模块映像的目录中。然后,我尝试使用“ --add-modules”手动添加模块,以及-p和-cp来指定带有jar的目录,但是我仍然收到ClassNotFound异常。

最佳答案

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

我学到了两件事:


制作jlink运行时映像后,不能将单独的jar(需要静态模块)放入与jlink映像相同的libs目录中。


换句话说,在jlink运行之后,您将获得如下目录结构:
箱子
conf
包括
法律
LIB

lib文件夹是运行时映像的存储位置。我将单独的jar放在lib文件夹中,但这不起作用。如果将它们放在单独的目录中,那么它将起作用。


必须先在序列中的-m命令之前放置“ -add-modules”开关,才能运行映像。


运行映像的最终命令可能如下所示:

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的目录的路径。

09-12 00:26