【发布时间】:2019-07-12 08:41:45
【问题描述】:
如果 Application 类不是 Main 类,我有一个非常基本的 JavaFX 应用程序可以完美运行:
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
public class Main {
public static void main(String[] args) {
Application.launch(App.class, args);
}
}
public class App extends Application {
@Override
public void start(Stage primaryStage) {
FXMLLoader loader = new FXMLLoader(); // works
}
}
但是,当我将两者合并在一起时(这是大多数教程中推荐的方式,包括 OpenJFX's official documentation),模块系统会抛出 IllegalAccessError(至少在 OpenJDK 11.0.2 上):
public class MainApp extends Application {
@Override
public void start(Stage primaryStage) {
FXMLLoader loader = new FXMLLoader(); // throws IllegalAccessError
}
public static void main(String[] args) {
launch(MainApp.class, args);
}
}
例外是:
java.lang.IllegalAccessError: class
com.sun.javafx.fxml.FXMLLoaderHelper(in unnamed module@0x642c1a1b) cannot access classcom.sun.javafx.util.Utils(in modulejavafx.graphics) 因为模块javafx.graphics不导出com.sun.javafx.util到未命名模块 @987654332 @
奇怪的是,我并没有积极地使用模块系统。我没有在我的项目中添加module-info.java。所以我假设一切都应该导出到任何未命名的模块?但这甚至不是重点。
主要问题是:为什么相同的代码分布在两个类中会有不同的行为?在这两种情况下FXMLLoader 使用com.sun.javafx.fxml.FXMLLoaderHelper,而后者又使用com.sun.javafx.util.Utils。所以要么我应该在这两种情况下都得到例外,要么都不例外。有什么区别?
【问题讨论】:
-
看起来很奇怪。请为此提供一个真实的 MCVE。
-
@flakes 尝试运行代码。可获取演示项目on GitHub
-
完美就是我想要的。在调查此问题时,确切的包名称和构建工具将很重要。
标签: java javafx java-11 java-platform-module-system javafx-11