当前位置: 首页 > 知识库问答 >
问题:

jlink JRE是否可以与外部JAR文件一起使用?

宇文和同
2023-03-14

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

我很感兴趣的是,是否有办法去掉一些模块,使它们成为单独的jar文件,但让jlink能够找到它们并仍然运行应用程序。有没有办法做到这一点?

例如,如果您正在处理一个LGPL库,那么就是这种情况的一个用例。您可能希望将LGPL库从庞大的模块“blob”中删除,并将其作为一个单独的jar删除,以便希望将jar换成不同版本/调整版本的人可以(这是LGPL所需要的)。

Jlink有一个“要求静态”语句,您可以使用它来要求一个可选模块。我想使用它可能会奏效,但我对此有问题。

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

当我尝试运行一个jlink项目时,我得到了ClassNotFind异常。

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

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

共有1个答案

闻人梓
2023-03-14

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

我学到了两件事:

  1. 制作jlink运行时映像后,单独的JAR(需要静态模块)不能与jlink映像放在同一个libs目录中

换句话说,在jlink运行之后,您会得到如下目录结构:bin conf include legal lib

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

运行图像的最后一个命令可能如下所示:

org.example.module.here,org.example.another.module.hereyour_jar_directory_hereyour.main.module/your.package.here.Main

这对我有用。您必须为add modules开关提供包含静态包含的模块的模块,并为-p开关提供包含这些模块的jar的目录的路径。

 类似资料:
  • 我一直使用ElasticsearchIntegrationTest在没有elasticsearch服务器的情况下测试我的代码。我的类中的私有成员很少,所以考虑使用Powermock访问私有成员。在运行测试时,我得到异常。 Powermock是否可以与ElasticSearchintegrationTest一起使用?? 代码: 例外情况: 原因:javassist.CanNotCompileExce

  • 我想让flume代理位于hadoop集群之外,并想知道是否有可能使用flume通过WebHDFS向hadoop集群发送消息。 如果没有,是否有使用WebHDFS的替代方案?使用多层水槽层仍然需要我在hadoop集群中运行水槽代理。

  • 是否可以在AWS Lambda中构建一个函数来创建websocket并将数据发送到订阅的应用程序? 类似这样: John在他的手机中打开了应用程序SuperPhotoApp,但决定使用桌面浏览器将照片上传到SuperPhotoApp服务(S3 Bucket),此事件执行创建套接字的Lambda函数。io服务器并将更新推送到所有订户,他的手机打开了应用程序,因此应用程序会自动更新新照片。 这可以通过

  • 我试着有两个文件。 第一个在应用程序JAR的根文件夹上。 第二个在类路径中指定的目录上。 2个文件都名为“Application.Properties”。 事实上,Jar版本的行为是正确的。这是java.exe的规范。当指定-jar选项时,java.exe同时忽略-CLASSPATH选项和CLASSPATH环境变量,并且类路径将只包含jar文件。因此,类路径上的第二个application.pro

  • dagger2是否可以和Guice一样与jersey一起使用? 是否有任何dagger2 servlet或dagger2 jersey项目?

  • 问题内容: 我正在尝试通过HTML执行以下操作: 基本上用户按下登录按钮,就会调用onLogin方法,该方法会将帖子发送到我的API。帖子工作正常,我确实在.then()承诺中得到了答复。 但是,尝试执行类似的操作并不会以我期望用户登录时HTML会执行的操作来更新DOM。 当我在promise中收到响应并且找不到“ vm”实例时,可能是我处于某种后台线程(对不起,这里是移动开发人员)? 谢谢 问题