我想为Windows x86 arch构建我的JavaFX应用程序.所以我下载了Adopt OpenJdk 32位版本并用它来创建Java Runtime Image.当我尝试运行应用程序时,我收到以下错误:
Loading library api-ms-win-core-console-l1-1-0 from resource failed: java.lang.UnsatisfiedLinkError: C:\Users\admin01\.openjfx\cache\11.0.1\api-ms-win-core-console-l1-1-0.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform
java.lang.UnsatisfiedLinkError: C:\Users\admin01\.openjfx\cache\11.0.1\api-ms-win-core-console-l1-1-0.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform
at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
Run Code Online (Sandbox Code Playgroud)
发生此错误是因为openjfx:javafx-graphics工件是平台相关的,它包括为64位arch编译的DLL.
$ file api-ms-win-core-console-l1-1-0.dll
api-ms-win-core-console-l1-1-0.dll: PE32+ executable (DLL) (console) x86-64, for MS Windows
Run Code Online (Sandbox Code Playgroud)
Maven Central中没有32位OpenJFX版本.
有可能在某处获得x86版本吗?或者我如何自己构建它?
当我们通过JLINK创建Java运行时需要的所有Java类/资源,并把它们变成JRT映像文件:lib/modules。
这是我使用的基本 Maven 项目资源结构:
src
main
resources
dict
xkcd_en
Run Code Online (Sandbox Code Playgroud)
我只是想阅读xkcd_en文本文件。如果我们查看 JRT 文件,它是:
>> jimage list /path/to/lib/modules
...
Module: main
dict/xkcd_en
...
Run Code Online (Sandbox Code Playgroud)
此外,我已明确在 中打开它module-info,以防万一:
module main {
opens dict;
// ..rest code omitted
}
Run Code Online (Sandbox Code Playgroud)
我可以读取文件的唯一方法是将其作为输入流获取:
作品:
public static InputStream getResourceAsStream(String resource) {
return FileUtils.class.getResourceAsStream(resource);
}
System.out.println(new BufferedReader(
new InputStreamReader(getResourceAsStream("/dict/xkcd_en")))
.lines().collect(Collectors.joining("\n"))
);
Run Code Online (Sandbox Code Playgroud)
不工作:
但是,如果我试图获取文件 URI 并通过 Java NIO API 读取它,则它不起作用:
public static URL getResourceOrThrow(String resource) {
URL url = FileUtils.class.getResource(resource);
Objects.requireNonNull(url);
return url;
}
Run Code Online (Sandbox Code Playgroud)
1 - …
关于 SO 有几个问题,但是由于 JPMS 支持没有任何答案是有效的。
方法 1:(JavaFX - 为整个应用程序设置默认 CSS 样式表)
Application.setUserAgentStylesheet(Application.STYLESHEET_MODENA);
StyleManager.getInstance().addUserAgentStylesheet(getClass().getResource("/style.css").toString());
Run Code Online (Sandbox Code Playgroud)
不起作用,因为StyleManager成为私有 API 的一部分,JavaFX 不导出它。
方法二:(/sf/answers/3570210591/)
@import "com/sun/javafx/scene/control/skin/modena/modena.css";
/* rest of CSS code */
Run Code Online (Sandbox Code Playgroud)
不起作用,因为modena.css成为私有 API 的一部分,JavaFX 不导出它。
方法 3:将 CSS 设置为顶部父节点(/sf/answers/2021629501/)
不起作用,因为 CSS 不会应用于模态窗口。
Vertx 文档建议executeBlocking()在需要调用阻塞 API 时使用方法。另一方面,Vertx 还提供了一个 Future 的概念,它基本上做同样的事情。但该executeBlocking()方法不是静态的。它也不是 Future 的简单包装器,如果您查看它的实现,您会发现它非常复杂。这两者有什么区别?
假设我想以异步方式执行一些长时间运行的任务。这两种方法有什么区别吗?
方法一:
doTheJob() {
Future<Void> future = Future.future();
executeLongRunningBlockingOperation();
future.complete();
return future;
}
doTheJob().setHandler(asyncResult -> {
// ... handle result
});
Run Code Online (Sandbox Code Playgroud)
方法二:
vertx.executeBlocking(future -> {
executeLongRunningBlockingOperation();
future.complete();
}, res -> {
// ... handle result
});
Run Code Online (Sandbox Code Playgroud) java ×4
asynchronous ×1
java-11 ×1
java-9 ×1
java-module ×1
javafx ×1
nio ×1
openjfx ×1
vert.x ×1