在运行由 jpackage 为 Mac OS X 构建的 Javafx 应用程序时,我注意到一些奇怪的事情。
如果我运行以下代码:
public class Test extends Application {
public static void main(String[] args) {
com.apple.eawt.Application.getApplication();
launch(args);
}
public void start(Stage stage) {
System.out.println(Thread.currentThread().getName());
}
}
输出将是这样的:“AppKit 线程”
如果我注释掉,com.apple.eawt.Application.getApplication()
那么我们会得到正确的输出:“JavafX Application Thread”
当我稍后在 Javafx 尝试加载 css 文件时遇到 NullPointerException 时,此问题是有问题的,因为它的 AppKit 线程有一个空的 ClassLoader。
我可以通过至少 3 种方式重现上述问题:
- 调用
com.apple.eawt.Application.getApplication()
如上图。 - 调用
new JGoogleAnalyticsTracker(config, GoogleAnalyticsVersion.V_4_7_2);
which 是我使用的库。
注意:当我从 Intellij 运行我的应用程序时,不存在上述问题。仅当我使用jpackage
构建二进制代码来启动 JVM 时才会出现该问题。我正在使用 Java 14 和 Javafx 14。
我的问题:
- 什么是“AppKit”线程,Java 从该线程调用是否正常?
- 上述情况是错误还是预期行为?