jlink JRE可以用于外部JAR文件吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jlink JRE可以用于外部JAR文件吗?相关的知识,希望对你有一定的参考价值。

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

我有兴趣找出是否有办法省略一些模块,以便它们是单独的jar文件,但是jlink将能够找到它们并仍然运行应用程序。有没有办法做到这一点?

例如,如果您正在处理LGPL库,那么一个用例就是这样。您可能希望将LGPL库从模块的巨大“blob”中排除,并将其作为单独的jar保留,以便有人想要将jar交换为不同的版本/调整版本(可以是LGPL要求) 。

Jlink有一个“需要静态”语句,您可以使用它来要求可选模块。我认为使用它可能有用,但我遇到了这个问题。

当我使用requires static编译项目时,我已经能够通过使用java的“--add-modules”开关包含模块来运行它。但是,一旦我在其上运行jlink来创建自定义图像,我就无法使其工作。

当我尝试运行jlinked项目时,我得到了ClassNotFound异常。

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

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

答案

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

我学到了两件事:

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

换句话说,在jlink运行之后,你得到一个像这样的目录结构:bin conf包含legal lib

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

  1. 必须在序列中的-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的目录的路径。

以上是关于jlink JRE可以用于外部JAR文件吗?的主要内容,如果未能解决你的问题,请参考以下文章

jdk19最新版本下载怎么没有jre

刚安装的java jdk11,发现安装路径没有jre文件夹

如何通过JLINK烧写文件到百为STM32开发板外部的NOR FLASH

Jar 中的 @PropertySource 用于类路径上的外部文件

springboot stringredistemplate 能存对象吗

Java可以编写能在WINDOWS下的exe程序吗 就是可执行文件