我一直在尝试通过使用Hello和Hello程序将我的程序迁移到jlink。在运行程序时,我所遵循的示例似乎指定了--add-。我不明白为什么程序需要在运行时提供jlink时所提供的信息。
现在,我已经成功地构建了一个简单的jlink Hello程序,它将在命令行中不使用添加模块来运行。诀窍是更改jlink模块路径上指定的模块的顺序。我不知道为什么会这样。
JDK-9、JDK-10或JDK-11文档中指定或描述的jlink行为在哪里?如何构建模块路径?
旁白:30年前,当我在DEC PDP-11微型计算机上连接Fortran和Macro-11程序时,这种有序连接是很常见的。当我打算放弃的时候,我想试着摆弄jlink的订单。
模块-info.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会返回列表来解析它刚刚发现的早期模块中的符号。考虑到这一点,我怀疑这样做的原因是,每次添加一个新模块时,返回搜索未解决的符号将需要对大型应用程序进行更长的链接过程。听起来对吗?
发布于 2018-11-12 14:41:44
@AlanBateman 他在评论中说
指定到-模块路径的模块路径是目录或模块的路径.因此,如果指定具有相同模块的不同版本的多个位置,则顺序非常重要。
在这两个示例中,您都将JavaFX JMOD文件和JavaFX JAR文件包含在--module-path中。区别在于你包括它们的顺序。
jlink将使用包含在JMOD文件中的模块
jlink将使用JAR文件中包含的模块
JavaFX SDK附带的JAR文件不包含任何必要的本机代码。如果链接到JAR文件,则结果映像将无法执行。
但是,JMOD文件确实包含必要的本机代码。实际上,将本机代码与Java代码捆绑是实现JMOD格式的主要原因之一。来自9月261
新的JMOD格式超越了JAR文件,包括本机代码、配置文件和其他类型的数据,这些数据如果有的话根本不适合JAR文件。JMOD文件用于打包JDK本身的模块;如果需要,开发人员也可以使用它们来打包自己的模块。 JMOD文件可以在编译时和链接时使用,但不能在运行时使用。要在运行时支持它们,一般情况下,我们需要随时提取和链接本地代码库。这在大多数平台上都是可行的,尽管它可能非常棘手,而且我们还没有看到很多需要这种功能的用例,所以为了简单起见,我们选择限制JMOD文件在这个版本中的实用价值。
在使用jlink时,您应该在可用的地方链接到JMOD文件。如果库不提供JMOD文件,那么链接到JAR文件。
尽管如此,您应该将JavaFX JAR文件从--module-path中全部删除--它们是不必要的,并且会造成混乱。
https://stackoverflow.com/questions/53240219
复制相似问题