gpt4 book ai didi

java - jlink JRE 可以与外部 JAR 文件一起使用吗?

转载 作者:行者123 更新时间:2023-11-30 05:40:21 28 4
gpt4 key购买 nike

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

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

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

Jlink 有一个“require static”语句,您可以使用它来请求可选模块。我认为使用这个可能会起作用,但我遇到了问题。

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

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

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

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

最佳答案

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

我学到了两件事:

  1. 制作 jlink 运行时镜像后,您的单独 jar(需要静态模块)无法放入与 jlink 镜像相同的 libs 目录中。

也就是说,jlink运行后,你会得到这样的目录结构:垃圾桶 session 包括合法的库

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

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

    关于java - jlink JRE 可以与外部 JAR 文件一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55775068/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com