Java 中的 jlink 功能允许您为应用程序创建单独的运行时环境。通常,这个应用程序所需的所有模块都被 jlink 压缩到一个大的“模块”文件中。
我有兴趣找出是否有办法省略一些模块,以便它们是单独的 jar 文件,但这样 jlink 将能够找到它们并仍然运行应用程序。有没有办法做到这一点?
例如,如果您正在处理 LGPL 库,则这种情况的一个用例是。您可能希望将 LGPL 库排除在模块的巨大“blob”之外并将其作为单独的 jar 保留,以便想要将 jar 交换为不同版本/调整版本的人可以(这是 LGPL 要求的) .
Jlink 有一个“需要静态”语句,您可以使用它来要求可选模块。我认为使用它可能会起作用,但我遇到了这个问题。
当我用需要静态编译一个项目时,我已经能够通过使用 java 的“--add-modules”开关包含模块来运行它。但是,一旦我在其上运行 jlink 以创建自定义图像,我就无法让它工作。
当我尝试运行 jlinked 项目时,我得到 ClassNotFound 异常。
当您在项目上运行 jlink 时,它会创建一个自定义运行时映像。项目的所有主要模块都放入一个名为 modules 的图像文件中。我已经使用 jimage 命令检查了这个图像文件,并且我已经确认这个图像文件不包含我声明为静态的模块。
使用 jlink,我尝试将静态声明的模块中的 jar 文件放入带有模块映像的目录中。然后我尝试使用“--add-modules”手动添加模块,以及使用-p和-cp来指定带有jar的目录,但我仍然得到一个ClassNotFound异常。