- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试通过 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:
module TestFXord {
requires javafx.controls;
exports testfxord to javafx.graphics;
}
TestFXord.java:
package testfxord;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class TestFXord extends Application {
@Override
public void start(Stage primaryStage) {
Button btn = new Button();
btn.setText("Say 'Hello World'");
btn.setOnAction((ActionEvent event) -> {
System.out.println("Hello World!");
});
StackPane root = new StackPane();
root.getChildren().add(btn);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
jlink 命令不生成可运行的图像
#! /bin/sh
<jdk-11-path>/bin/jlink --module-path <jdk-11-path>/jmods:<javafx-sdk-11-path>/lib/javafx.base.jar:<javafx-sdk-11-path>/lib/javafx.controls.jar:<javafx-sdk-11-path>/lib/javafx.graphics.jar:<javafx-jmods-11-path>:<path-to-projects>/TestFXord/dist/TestFXord.jar --add-modules TestFXord --strip-debug --launcher TestFXord=TestFXord/testfxord.TestFXord --output dist/jlink/TestFXord
jlink 命令确实构建了可运行的镜像。请注意,现在立即出现在它所依赖的之后。
#! /bin/sh
<jdk-11-path>/bin/jlink --module-path <jdk-11-path>/jmods:<javafx-jmods-11-path>:<javafx-sdk-11-path>/lib/javafx.base.jar:<javafx-sdk-11-path>/lib/javafx.controls.jar:<javafx-sdk-11-path>/lib/javafx.graphics.jar:<path-to-projects>/TestFXord/dist/TestFXord.jar --add-modules TestFXord --strip-debug --launcher TestFXord=TestFXord/testfxord.TestFXord --output dist/jlink/TestFXord
我认为jlink逐步构建一个符号表,将符号映射到地址,沿着模块路径从左到右工作,并解析(查找其地址)它有地址的符号,并且添加它发现的可用于解析后续模块中的调用的新符号条目。如果模块路径的顺序正确,每个符号都将在此过程中得到解析。如果模块路径的顺序不正确,则会出现尚未解析的符号。当涉及到运行图像时,用户必须添加模块来解决剩余的符号。
换句话说,我认为 jlink 不会返回列表来解析它刚刚发现的早期模块中的符号。考虑一下,我怀疑这样做的原因是,每次添加新模块时返回搜索未解析的符号对于大型应用程序将需要更长的链接过程。听起来对吗?
最佳答案
作为@AlanBateman said in his comment :
The module path specified to --module-path is a path of directories or modules. So the order does matter if you specify multiple locations that have different versions of the same module.
在两个示例中,您都将 JavaFX JMOD 文件和 JavaFX JAR 文件包含在 --module-path
中。不同之处在于您添加它们的顺序。
jlink
将使用 JMOD 文件中包含的模块jlink
将使用 JAR 文件中包含的模块JavaFX SDK 附带的 JAR 文件不包含任何必要的 native 代码。如果链接 JAR 文件,生成的镜像将无法执行。
但是,JMOD 文件确实包含必要的 native 代码。事实上,将 native 代码与 Java 代码捆绑在一起是实现 JMOD 格式的主要原因之一。来自 JEP 261 :
The new JMOD format goes beyond JAR files to include native code, configuration files, and other kinds of data that do not fit naturally, if at all, into JAR files. JMOD files are used to package the modules of the JDK itself; they can also be used by developers to package their own modules, if desired.
JMOD files can be used at compile time and link time, but not at run time. To support them at run time would require, in general, that we be prepared to extract and link native-code libraries on-the-fly. This is feasible on most platforms, though it can be very tricky, and we have not seen many use cases that require this capability, so for simplicity we have chosen to limit the utility of JMOD files in this release.
使用jlink
时,您应该链接到可用的JMOD文件。如果库不提供 JMOD 文件,则链接到 JAR 文件。
综上所述,您应该从 --module-path
中完全删除 JavaFX JAR 文件——它们是不必要的并且会引起困惑。
关于java - jlink --module-path 是有序路径吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53240219/
使用的 dockerfile - FROM azul/zulu-openjdk-alpine:11 as jdk RUN jlink \ --module-path /usr/lib/jvm/
我正在尝试为使用 Java 11 构建并使用 jlink 打包的应用程序构建跨平台存档。 对于跨平台打包,我的构建基于 this answer .我已经设法让我的 Gradle 构建下载目标平台的 J
使用Gradle,这是jlink很常用的脚本: plugins { id 'application' id "org.beryx.jlink" version "2.16.3" } j
我们正在研究如何升级到Java 9。JLINK 的一个新功能是生成我们自己的JRE,与我们的应用程序完美匹配。 我有一些关于它的幼稚问题: 在什么情况下我们应该这样做?我了解微服务的好处,但 Web
一段时间以来,我一直在处理模块化项目,但由于受到文件名和自动模块的限制,我从未有机会使用 jlink 工具来生成可再分发的应用程序镜像。今天我选择启动一个不导入任何外部依赖项的独立项目,以防止使用兼容
借助 JLink,我能够使用小型 JVM 构建我的应用程序。目前,构建是整体的:所有 java 模块都融化在一个文件中(可以使用 jimage 提取): jlinkImage/ └──lib/
我有一个简单的 hello world spring 2 启动应用程序,它与完整的 JDK 13 一起运行。现在我正试图让它与使用 spring boot 的自定义 JRE 一起运行。 过去当我需要外
我有一个依赖于自动模块的显式模块化项目;例如在 java.activation 上。仍然可以使用jlink吗? 请参阅此模块信息.java: module hello { requires j
这个问题已经有答案了: How to extract the file jre-9/lib/modules? (6 个回答) 已关闭 5 年前。 在 Java 8 中,我需要混淆应用程序的 jar/c
我遇到了一个问题,无法使用jlink进行编译,我现在知道出了什么问题:jlink无法编译自动化模块,因为它们不稳定名称。有解决方法或解决办法吗?以下是我的代码的相关部分: 模块信息.java modu
我正在使用 Gradle 和 Badass JLink Plugin分发我的软件。不幸的是,我不知道如何在图像中包含某些文件(例如 README.md、一些测试输入等)。我认为它需要在 build.g
我已经配置了ModiTect生成 module-info.java s 对于我所有的依赖项(没有它们),这似乎是有效的;但是当涉及到确实拥有它们的依赖项时,它并没有找到它们。对于我自己的 jar ,我
我一直在尝试通过 Hello World 和 Hello JFX World 程序将我的程序迁移到 jlink。我遵循的示例似乎在运行程序时指定了--add-modules。我不明白为什么程序需要在运
jlink 压缩选项有什么作用? oracle 文档对此没有详细说明: Enable compression of resources: 0: No compression 1: Constant s
我面临的问题是jlink的服务绑定(bind)选项链接了很多很多模块,似乎没有一个是必要的。省略服务绑定(bind)选项时,不会链接这些模块。 问题: 问题 1:您在您的环境中看到过相同的行为吗? 问
我有一个 dropwizard 应用程序,它在标准 JRE 上运行良好。 我尝试使用 jlink 创建运行时,它要小得多: /Library/Java/JavaVirtualMachines/jdk-
当我们创建 jlink 运行时图像时,我们可以使用诸如“--strip-debug”、“--compress”、“2”、“--no-header-files”、“--no-man-”等标签pages'
我在我的 Linux 机器上使用 jlink 创建了运行时镜像。我在 include 文件夹下看到了 linux 文件夹。这是否意味着我只能将此运行时镜像用于 Linux 平台?如果是,是否有任何方法
我有一个正常运行的 jlink 图像(包括自定义 jre)。它工作正常。但对于我的用例,我需要将 jlink 图像的所有文件打包成一个包含可执行文件 (.exe) 的文件。 我能够使用 OpenJDK
我有一个简单的 hello world java 应用程序,我手动下载了 org.json 并将其添加到我的类路径中,以便下面的应用程序运行。我如何制作自定义 JRE 来运行这个包含 jar 的应用程
我是一名优秀的程序员,十分优秀!