Java中的jlink功能允许您为应用创建单独的运行时环境。通常,此应用程序所需的所有模块都通过jlink压缩为一个大的“模块”文件。
我感兴趣的是找出是否有一种方法可以省去一些模块,以便它们是独立的jar文件,但jlink可以找到它们并仍然运行应用程序。有办法吗?
例如,这是一个用例,如果您正在处理LGPL库。您可能希望将LGPL库从巨大的模块“ blob”中剔除,并将其作为单独的jar保留,以便希望将jar换成其他版本/调整后的版本的人可以使用(LGPL要求)
Jlink有一个“需要静态”语句,可用于要求可选模块。我认为使用此功能可能会奏效,但与此同时我遇到了问题。
当我编译一个需要静态的项目时,我已经能够通过使用Java的“ --add-modules”开关包含模块来运行它。但是,一旦在其上运行jlink以创建自定义图像,我将无法使其正常工作。
当我尝试运行链接的项目时,出现ClassNotFound异常。
在项目上运行jlink时,它将创建一个自定义运行时映像。项目的所有主要模块都放入一个称为模块的映像文件中。我已经使用jimage命令检查了此图像文件,并且已经确认theis图像文件不包含我声明为静态的模块。
使用jlink,我尝试将静态声明的模块中的jar文件放入带有模块映像的目录中。然后,我尝试使用“ --add-modules”手动添加模块,以及使用-p和-cp来指定带有jar的目录,但仍然会收到ClassNotFound异常。
答案 0 :(得分:1)
好的,发布此消息后不久,我回答了我自己的问题。
我学到了两件事:
换句话说,在jlink运行之后,您将获得如下目录结构: 箱子 conf 包括 法律 库
lib文件夹是存储运行时映像的位置。我将单独的jar放在lib文件夹中,但这不起作用。如果将它们放在单独的目录中,则可以使用。'
运行图像的最终命令可能如下所示:
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的目录路径。