【问题标题】:Jigsaw / Jlink for modular Java projects to minimize JRE sizeJigsaw / Jlink 用于模块化 Java 项目以最小化 JRE 大小
【发布时间】:2021-03-28 23:07:12
【问题描述】:

我试图了解 Java 模块化项目的这两个原则/特性之间的差异或关联。

我正在尝试通过减少外部库/模块的使用来最小化 JRE 大小。

为了做到这一点,我做了一些快速研究,发现这两个“原则”可能对我有帮助。

现在,我不明白这两件事是否不同,或者它们是否以某种方式相互关联。我应该如何使用这些来达到我的目标? 您能否指定对我来说最好的解决方案?我必须在 module-info.java 中手动指定我需要什么吗?

是否有可能生成 module-info.java 文件? (我猜不是,但我只是在问)。我可以将它与 JDK Amazon Correto 11 一起使用吗?

【问题讨论】:

  • 你说的是哪“两个原则”?
  • @Holger 我说的是jigsaw vs jlink。我看到 jlink 可能适合我正在尝试做的事情。实际上,我需要一个更小的 JRE 来满足我的应用程序。 Jlink 是解决方案,但我想知道如何生成那些包含要导入和导出的包的 module-info.java 文件。
  • “jigsaw”和“jlink”都不是原则。而且由于 jlink 是 jigsaw 的一部分,我仍然不明白“jigsaw vs jlink”或“这两个原则之间的差异……”应该是什么意思。您可以使用jdeps 来分析依赖关系,它甚至还有--generate-module-info 选项,但不要要求我们提供完整的教程。
  • 无意冒犯。我们有时会对自己不清楚的问题感到困惑,并认为我们可能错过了一些东西。所以我们问。 Jigsaw 是old project name,Java 模块系统就是在这个old project name 下开发的。你不需要知道或使用它。但是如果你遇到它,你可以把它当作Java模块系统的同义词。
  • 不要试图理解每一票。这不会导致任何地方。

标签: java java-11 java-module java-platform-module-system jlink


【解决方案1】:

您实际上发布了多个问题。

我正在尝试通过减少外部库/模块的使用来最小化 JRE 大小。

减少依赖总是一个好的目标。 jigsaw/JPMS 不会帮助你。相反:事实上,您最终可能会得到同一个依赖项的多个版本,这在以前是不可能的。

提示:JLink 和 JIGSAW/JPMS 不会帮助您减少依赖关系。

我应该如何使用这些来达到我的目标?

如果您的目标是为您的应用程序提供一个精简的 JVM,您应该查看 into the jlink binary,它是自 Java 9 以来 JDK 的一部分。

如果您使用的是 maven,则可以使用 maven-jlink-plugin 调用它。 gradle 甚至 maven 都有类似的插件(例如 javafx-specific 插件)。

您能否指定对我来说最好的解决方案?

这是我们无法回答的问题。 YMMV——也许quarkus 也值得一看,它会创建原生镜像(是的,依赖于操作系统和架构的原生二进制文件)。

我必须在 module-info.java 中手动指定我需要什么吗?

是的,对于您的模块。如果您使用 maven 将 module-info.class 文件注入到您的依赖项中,则可以使用 moditect,至少如果您使用 maven 作为构建系统。

是否有可能生成 module-info.java 文件?我猜不是,但我只是在问)

已经在 cmets 中回答了,是的,by using jdeps

我可以将它与 JDK Amazon Correto 11 一起使用吗?

是的,他们还提供 jlink 和 jdeps。

【讨论】:

  • 非常感谢您的回答。我将尝试查找所有详细信息。似乎 JLINK 是解决方案。自定义运行时映像将在这里帮助我。当我实现我需要的东西时,我会回来回答。是的,我正在使用 Maven。谢谢。
  • 如何在 Intellij 中的模块上启用 module-info.java 创建?似乎如果我手动创建它,它不会将其识别为模块描述文件。我有 amazon correto 11。项目设置为使用最新版本的 java。
  • 尝试项目设置 (Ctrl+Alt+Shift+S),然后至少选择 Java 9。在 java 根文件夹中添加一个 module-info.java 文件(可能不在包中)。然后您可以在导入时按 Alt-Enter,应该会弹出“添加要求”。
  • 感谢您的提示。项目结构有点混乱,因为我有两个具有相同包路径的模块,所以它会以某种方式发生冲突。不知道这个有没有什么技巧。加上“需要”文件,它抱怨同一个包来自两个依赖项。我认为这可以通过从其父项中排除其中一个依赖项来拯救我。例如对于 java.persistance 来自 javax.persistance / jakarta.persistance。脏东西。有适当的解决方法吗?
猜你喜欢
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 2016-09-15
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多