问题标签 [jlink]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1089 浏览

java - jlink:服务绑定链接了许多不必要的模块

我面临的问题是 jlink 的服务绑定选项链接了很多很多模块,它们似乎都不是必需的。当省略服务绑定选项时,这些模块不会链接。

问题:

  • Q1:你在你的环境中看到同样的行为吗?
  • Q2:这是错误还是期望的行为?
  • Q3:为什么所有这些模块都链接在一起?

我的应用程序:该应用程序是一个简单的服务,由一个接口、一个提供者和一个消费者组成,每个都打包到一个单独的模块中,称为modServicemodProvidermodConsumer(详细信息如下)。

操作系统:Windows 10

Jlink without --bind-services产生预期结果:

当应用该--bind-services选项时,我希望另外模块modProvider应该被链接。但是,看看会发生什么(三个自定义模块在最后):

我不知道为什么所有这些模块都被链接,因为提供者只返回一个字符串,因此不需要除 java.base 之外的其他 jdk 模块。

以下是 Java 工件:

任何帮助表示赞赏。

0 投票
0 回答
986 浏览

java - java9中的`jlink`不保存分解目录中的资源?

我有点困惑jlink。我能够编译我的源文件,然后使用jlink以下命令

它返回一个像这样的树结构文件夹:

jlink --help没有提到如何包括resources使用它的任何选项。

我可以launch通过双击来运行启动器,但随后出现与无法找到资源相关的错误(当然,因为它们不在外文件夹中)

但是,即使我尝试手动将资源放在目录树中的任何位置,launch仍然无法找到资源。

是否jlink旨在javapackager完全、部分、完全替代?

我们可以通过jlink在 Java 9 应用程序中配置模块然后将其捆绑在一个应用程序中来部署应用程序jar吗?

如果我们使用jlink,我们如何才能正确地将resources文件包含在outfolder?

~提前谢谢~

0 投票
1 回答
379 浏览

java - 将资源和服务代码添加到 Jlink 图像

现在假设您有一个应用程序让(高级)用户编写资源文件并编译服务代码(来自模板)

在 Java 9 之前,我使用两个不同的 jar 来做到这一点:一个是 theApp.jar,另一个是 theAdppDeploy.jar,后者是在站点上从模板生成的。

使用模块化系统仍然可以完成(尽管我们将有跨模块的交叉依赖关系)

但是是否可以考虑由 Jlink 生成的 JImage 并通过添加资源文件和服务代码让(高级)用户使用该图像进行玩具?怎么做(如果可能)?

谢谢

0 投票
1 回答
1293 浏览

java - jlink没有找到module-info.class

我正在使用带有布局的 Maven 项目

我使用的唯一插件是 maven-compiler-plugin,版本 3.7.0。

当我运行命令时 jlink --module-path $JAVA_HOME/jmods:target --add-modules foo --output jre ,输出是Error: Two versions of module foo found in target (foo.jar and classes)

但是当我运行jlink --module-path $JAVA_HOME/jmods:target/foo.jar --add-modules foo --output jre它说Error: Module foo not found

所以 jlink 能够看​​到模块存在,但找不到我的模块信息。maven 是否缺少一些东西来将该文件放在正确的位置?

0 投票
0 回答
544 浏览

java - 为什么 jlink 会创建一个无法在 Linux 中进行符号链接的启动器?

在经历了很多痛苦之后,我已经模块化了我的 Java 9 应用程序,但现在一切似乎都在工作,我想为我的应用程序创建一个本机启动器。

我使用 jlink 来做到这一点。

这是我用来调用 jlink 的 Gradle 任务:

这可行,我可以使用启动器启动 Java 应用程序:

但是当我在 Linux 中添加符号链接时,它就不起作用了......

这是我添加链接的方法:

当我跑rawhttp我得到这个错误:

因此,看起来生成的启动器不知道如何引用相对于自身的其他文件!在我看来,这是为启动器编写代码的人的一个基本错误!

这是生成的启动器文件:

有谁知道不涉及手动修复 Java 的 jlink 正在生成的启动器的解决方法?

我使用的 Java 版本:9.0.4+11 操作系统:Ubuntu

0 投票
1 回答
377 浏览

java - JDK9 Packager:创建没有运行时的映像

在 Java 8 中使用 Java Packager 时,可以选择不在生成的图像中包含运行时(例如,请参阅此问题)。

我正在尝试实现相同的目标(使用此处描述的 ant 任务)。但是我不知道如何在结果.app.exe文件中不包含 JVM。

我问的原因:我正在使用该jlink实用程序创建自己的运行时,并希望替换与应用程序捆绑在一起的默认运行时。这工作得很好,但无论如何替换默认运行时,首先包含它是不必要的步骤。

旁注:该应用程序尚不兼容 JPMS,因此包含整个 JVM。

0 投票
0 回答
125 浏览

java - Jlinking 时 Moditect 找不到当前模块

我正在使用ModiTect来 Jlink 我的 Java 应用程序。按照自述文件和两个示例undertowvert.x,我将其添加到我的pom.xml

我还使用 ModiTect 将module-info.javas 注入到没有它们的依赖项中,但我认为这与这个问题无关。当我运行mvn package它失败并出现以下错误:

那就是这个 pom.xml 的模块。为什么找不到它(当示例似乎表明它会自动找到时)?

添加模块路径使其可找到:

但我必须指向目录classes中的target子目录,因为如果我指向以便可以找到target该文件,我会收到此错误:jar

0 投票
1 回答
950 浏览

java - ModiTect 和 Jlink 找不到模块依赖项

我已经将ModiTectmodule-info.java配置为为我的所有依赖项(没有它们)生成s 并且这似乎有效;但是当涉及到确实拥有它们的依赖项时,它并没有找到它们。对于我自己的罐子,我正在手写module-info.java

当我mvn package在我的应用程序中运行时,它失败了:

命令行如下所示:

我知道tech.flexpoint.dashmancommon是一个模块并且有一个module-info.java,因为我自己构建了它。如何让 ModiTect/jlink 在其原始 jar 中找到所有依赖模块?

正在建设的ModiTect 配置如下所示:

如果我添加

到我的 ModiTect 配置,它开始工作,生成这个命令行:

我想这证实了该模块的工作原理并已安装。我只是不确定如何让 ModiTect 找到它(没有可怕的硬编码路径)。

0 投票
1 回答
900 浏览

java - java 9 第三方模块适用于 IDE,但不适用于 jlink

该程序基于 JDK 9(JPMS),在使用 IDE(Intellij ) 我“需要”它们,程序运行良好。当我尝试使用 java9 'jlink' 获取我的自定义 JRE 时,我得到以下信息:

问题是:为什么那些带有 IDE 的软件包可以正常工作?如果它们没有被模块化,那么它们也不应该在 IDE 中工作。

PS:我在使用 jlink 时将这些 jar 添加到“根”文件夹中。

0 投票
1 回答
227 浏览

java - jlink 是否仍然需要混淆(即可以在模块文件上运行反编译器)?

在 Java 8 中,我需要为应用程序混淆 jar/class 文件。我正在将此应用程序迁移到 Java 10,并且我还在更新构建过程以使用模块,这样我们就不必提供完整的 JRE。

当我用模块编译(javac)然后构建我的精简 JRE(jlink)时,我注意到 dist/lib/modules 文件是包含我编译代码的文件。但是,当我检查 dist/lib/modules 时,该文件不是 ZIP 文件,而且看起来我的代码也不可见。

有没有办法反编译 dist/lib/modules?我应该在调用 jlink 之前混淆我的 *.class 文件吗?

这是我的构建流程的示例: