问题标签 [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 投票
1 回答
997 浏览

java - 有关 OpenJDK 11 和 OpenJFX 11(和 Proguard)的迁移问题

我们目前正在将 Java 应用程序从 Oracle JDK 8(由 JNLP 交付的应用程序代码)迁移到 OpenJDK 11(作为可运行的应用程序代码与 Java 运行时一起交付)。尽管我们在测试环境中或多或少地找到了一个可行的解决方案,但我们仍然存在以下问题:

  1. 我们的应用程序需要 JavaFX,我们希望使用 jlink 进行构建。是否建议使用https://gluonhq.com/products/javafx上提供的 OpenJFX jmods来使用 OpenJDK 构建适当的 jlink 映像,还是有其他选择?

  2. OpenJFX jmods 似乎目前在 gluonhq 上的版本 11(为 JDK 11 编译)中正式提供,而 Proguard 混淆适用于为 JDK 编译的代码,直到版本 10(请参阅https://sourceforge.net/p/proguard/feature -请求/188/)。不确定 Proguard 何时也支持版本 11。我们应该等到它发生,还是我们有什么选择?下载和构建针对版本 10 的 OpenJFX 源(我不知道这是否可能开箱即用),或者甚至保留 Oracle 10 JDK 二进制文件和/或其 javafx jmod 文件是一个不错的选择吗?只要 Proguard 不懂 OpenJDK 11 代码?

  3. 我们正在进一步寻找一种工具来为 Windows 和 MacOS 创建用户友好的可运行文件(例如,无需修改注册表的自解压可执行文件)。javapackager 现在似乎不可用(http://openjdk.java.net/jeps/343计划用于 OpenJDK 12)并且既不支持交叉编译也不支持自动更新机制。因此,我们正在寻找一种工具,它可以做到 a) 自动更新(在启动时动态加载应用程序代码或新的 jlink 图像)和 b) 为 Windows 和 MacOS 构建可运行文件。有没有什么好工具支持类似于 Oracle 的 JNLP 启动器的自动更新机制,可以在生产环境中使用?

  4. 对于 JNLP,我们应用代码签名。是否仍然建议并且可以签署 a) 我们位于 jlink 图像中的应用程序代码和 b) 动态加载的应用程序代码,两者都是使用 JDK11+ 构建的?

谢谢你的帮助,彼得。

0 投票
0 回答
1045 浏览

java - XMLBeans 更改默认生成的 .xsb 文件位置

好的,所以我有一个使用 XMLBeans 3.0 的主应用程序。我正在尝试使用 Java10 和 Jlink 创建一个自包含的 JVM。所以我使用 scomp 命令根据一些 XSD 文件生成我的 Java 类,我将这个 JAR 命名为 custom.jar。我打开 custom.jar 并注意到 scomp 将 .xsb 文件放在这个包下:

现在我的 JLink 项目也依赖于 xbean.jar。而且这个JAR似乎也有一个类似于custom.jar的包:

所以我编译主项目并使用 JLink 创建一个 JVM 运行时映像。然后我就可以提出我的申请了。
问题是在运行时我的应用程序引用了我的 custom.jar 中的一个类,我得到了一个丢失的文件错误。查看堆栈跟踪,似乎类加载器正试图在 xbean.jar 下找到我的自定义 .xsb 文件,但该 JAR 上当然不存在它。

我不太熟悉类加载的工作原理,尤其是现在在 Java10/模块中,但有人知道解决这个问题的方法吗?

这些是相关包路径的 module-info xbean.jar 的导出:

这些是我的 custom.jar 的类似包路径的导出:

下面是堆栈跟踪,但查看 xbean.jar 源代码,这是找不到 .xsb 文件的行:

可能是对任何模块信息文件的修改,或者如何告诉 scomp 更改默认的 schemaorg_apache_xmlbeans.system 包?

预先感谢。

0 投票
1 回答
412 浏览

java - jlink命令行参数--strip-debug是什么意思?

哪个效果帽子jlink命令行参数--strip-debug

jlink的文档中,您可以阅读:

从输出图像中去除调试信息

但这意味着什么?将删除哪种类型的调试信息?我可以想到堆栈跟踪的行号。是这个意思吗?

0 投票
1 回答
2655 浏览

java - 有没有办法在 IntelliJ IDEA 中使用 jlink 来创建自定义模块化运行时映像?

我正在关注 IntelliJ IDEA 2018.2.5 中的Project Jigsaw:模块系统快速入门指南在链接器部分之前,我在 IDE 中做的一切都是正确的。有没有办法在 IntelliJ IDEA 中使用 jlink?

jlink(参见JEP 282)是链接器工具,可用于链接一组模块及其传递依赖项,以创建自定义模块化运行时映像(参见JEP 220)。
- Project Jigsaw:模块系统快速入门指南

我在JetBrains Bug & Issue Tracker中发现了产生 JLink artefacts问题的能力,但它已经开放了 2 年多,甚至没有描述。


作为一种解决方法,我看到了这个Is there a maven jigsaw jlink plugin? 有趣的问题和最有希望的替代方案似乎是Apache Maven JLink 插件,但它也已经存在了 2 年多,还没有发布。

0 投票
1 回答
1396 浏览

java - jlink --module-path 是有序路径吗?

我一直在尝试通过 Hello World 和 Hello JFX World 程序的实验将我的程序迁移到jlink 。在运行程序时,我遵循的示例似乎指定了--add-modules 。我不明白为什么程序需要在运行时提供它在 jlink 时提供的信息。

我现在已经成功构建了一个简单的jlink Hello World 程序,该程序无需在命令行上使用--add-modules即可运行。诀窍是更改 jlink 模块路径上指定的模块的顺序。我不知道为什么这有效。

JDK-9、JDK-10 或 JDK-11 文档中在哪里指定或描述了这种 jlink 行为?应该如何构建模块路径?

旁白:这种有序链接在 30 年前很常见,当时我曾经在 DEC PDP-11 小型计算机上链接 Fortran IV 和 Macro-11 程序。当我即将放弃时,我想尝试摆弄 jlink 的订购

模块信息.java:

TestFXord.java:

不生成可运行映像的 jlink 命令

构建可运行映像的 jlink 命令。请注意, now 出现在它所依赖的 the 之后。

我认为jlink逐步构建一个符号表,将符号映射到地址,从左到右沿着模块路径工作并解析(查找地址)它具有地址的符号并添加它发现的新符号条目可以是用于解析后续模块中的调用。如果模块路径的顺序正确,则每个符号都将在此过程中得到解析。如果模块路径的顺序不正确,则会出现尚未解析的符号。在运行图像时,用户必须添加模块来解析剩余的符号。

换句话说,我认为 jlink 不会返回列表来解析它刚刚发现的早期模块中的符号。考虑到这一点,我怀疑这样做的原因是每次添加新模块时都要返回搜索未解析的符号,这对于大型应用程序需要更长的链接过程。那个听起来是对的吗?

0 投票
1 回答
2703 浏览

java - 编译依赖于外部 Jar 的模块

我使用 Java 11.0.1 中的Project Jigsaw 完成了一个简单的示例,该示例使用Ubuntu 18.04 上的 oracle JDK 11 构建。

按照那个例子,我创建了一个简单的项目,它编译成一个模块,将模块打包到一个 jar 中,然后jlink用来创建一个独立的发行版。一切正常——最终结果是一个小型文件夹,其中包含一个精简的 JRE 和我的模块。

该项目仅由三个文件和一些文件夹组成:

src/com/greetings/Main.java

src/模块信息.java

构建.sh


所有这些都有效。现在问题来了:

接下来我想做的是使用外部库,所以我在 Main.java 中添加了几行:

Main.java - 更新

然后我将commons-cli-1.4.jar放在一个名为lib.

它创建了这个文件结构:

我修改了编译行以在类路径中包含 commons jar:

但是,当我尝试编译它时,出现此错误:

如何修改我的项目以便可以针对 commons-cli-1.4.jar 进行编译


编辑,在用户 nullpointer 的建议下,我尝试将 -cp 标志更改为仅 -p 标志,因此将外部 jar 添加到模块路径中。不幸的是,这也行不通。这是我尝试过的各种 javac 命令也不起作用:

0 投票
1 回答
1260 浏览

java - 如何创建模块化 JavaFX11 可运行 jar/exe?

我已成功遵循openjfx-docs中提到的说明(使用 maven)

我可以在我的日食中运行它。我还可以使用 jlink 创建自定义运行时映像。该应用程序可以通过生成的启动器运行。

现在,我们如何使用 jlink 生成的精简 JRE 创建一个可运行的 jar/exe?

0 投票
0 回答
1390 浏览

spring - spring 与 jlink、moditect 和 java 11

感谢 pupeno 在 spring 和 moditect 上的先例工作,帮助我解决了我在这个主题上的大部分问题,但是我被他挡得更远了。

我的问题是非法访问异常

我的 poc 在github上可用

我曾经添加这段代码以使其与 intelliJ IDEA 一起使用:

但是知道 jlink 我不知道如何重现相同的曲目

这是我的完整堆栈跟踪:

我真的不知道我能做什么,因为我的模块安装是打开的并且需要(显然)需要的东西

我的 moditect 模块结构看起来像

我使用了 spring 5.1.3 和 spring data 2.1.3 和 hibernate 5.3.7

这是在不打开所有安装包的情况下做我想做的事情的一种方式吗?它似乎与新的模块安全系统相矛盾。

0 投票
3 回答
5623 浏览

java - 如何在 Java 11 中使用非模块化依赖项打包应用程序

我开发并分发了一个使用 Apache Batik 和 JavaCV 的 Java Swing 应用程序。我已经通过 java 1.6、7 和 8 对其进行了更新。macOS、Windows 和 Linux 的安装程序是使用 Javapackager 构建的。Java 8 在 19 年 1 月终止支持,我找不到在新 LTS 版本 Java 11 上打包和分发的解决方案。

JavaCV 或 Batik 都不会生成模块化 jar,但我设法将它们重新打包到可以在 Java 11 上编译和生成可运行 jar 的程度,应用程序工作正常,但我无法将其打包以进行分发。我计划下降到 Java 10 以使用 javapackager 并从那里捆绑 11 运行时,但它使用 jlink 生成自定义运行时,jlink 失败,因为 JavaCV 和 Batik 不是模块化的。由于 Batik 和 JavaCV 中的引用不满意,jdeps 不会生成 module-info.class 来修补并使它们模块化,即使我的应用程序在没有它们的情况下也能正常工作。

结果,我将不得不将代码库保留在 Java 8 中,并且即使不再受支持,也要发布它。

我知道有一个调用来创建 javapackager 的替代品,但直到 Java 8 被弃用之后才会出现。而且我仍然需要 Batik 和 JavaCV 项目来重构和构建模块化 jar 以生成自定义运行时。

谁能提供任何其他解决方案?我错过了什么吗?谢谢。

0 投票
0 回答
104 浏览

java - 如何将自定义 Java 模块更新为 JRE 映像

我有一个 Java 桌面应用程序,它是一个带有 module-info.java 文件的有效模块。我还使用 javapackager 命令创建自定义 JRE 运行时映像,然后使用 Inno Setup 为我的应用程序创建 Windows 安装程序。由于我的应用程序作为模块安装在自定义 JRE 映像中,是否可以对其进行更新?我不想使用 javapackager 更新我的应用程序,只需将我的应用程序模块更新到现有的自定义 JRE 映像中。

我注意到使用 javac 命令和 module-patch 参数是可能的,但我不确定如何使用它。任何人都知道我可以使用哪些命令和参数来执行此操作?提前致谢。