如何在我的JavaFX应用程序中使用StubToolkit而不是Quantum工具包?

时间:2014-01-15 12:08:20

标签: java jar jenkins javafx classnotfoundexception

我想在无头的Jenkins上运行JavaFX的TestFX测试。一种方法是使用“StubToolkit”而不是QuantumToolkit,因为在无头模式下使用后者会给我一个“java.awt.AWTException:无头环境”异常。描述了StubToolkit here

为了测试该过程,我想首先使用StubToolkit运行常规JavaFX应用程序。所以我......

  1. 内置OpenJFX(8),

  2. 使用gradle test

  3. 运行测试
  4. 找到modules/graphics/build/classes/test/com/sun/javafx/pgstub/下的StubToolkit类文件,

  5. 使用java jar cf StubToolkit.jar com(来自modules/graphics/build/classes/test目录)将它们放入jar中,

  6. 复制了我的示例JavaFX应用程序(MyApp.java)旁边的jar和

  7. 使用java -cp "StubToolkit.jar;." -Djavafx.toolkit=com.sun.javafx.pgstub.StubToolkit MyApp

  8. 运行应用

    这给了我一个CNFE:

    java.lang.ClassNotFoundException: com.sun.javafx.pgstub.StubToolkit
    at java.net.URLClassLoader$1.run(URLClassLoader.java:365)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:354)
    ...
    Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    ...
    Caused by: java.lang.RuntimeException: No toolkit found
    at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:213)
    at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:181)
    at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:637)
    ...
    

    我的JavaFX应用程序如下所示:

    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.control.Label;
    import javafx.stage.Stage;
    
    import com.sun.javafx.pgstub.StubPerformanceTracker;
    
    public class MyApp extends Application {
        @Override
        public void start(Stage primaryStage) {
            try {
                Label label = new Label("Hello World.");
                Scene scene = new Scene(label, 400, 400);
                primaryStage.setScene(scene);
                primaryStage.show();
                System.out.println(new StubPerformanceTracker());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    我包含System.out调用以检查StubToolkit jar中的类是否正确地放在类路径上,并且当我在没有使用-D开关的情况下启动它时,我的应用程序确实运行没有任何问题}}

    我在64位Windows 7上运行了所有这些测试。

    任何想法有什么不对?我很感激任何帮助。

1 个答案:

答案 0 :(得分:0)

有趣!使问题比通过Twitter更清晰:-)我很好奇如果手动尝试在应用程序中加载StubToolkit类会发生什么。

的Class.forName( “com.sun.javafx.pgstub.StubToolkit”)的newInstance();

http://hg.openjdk.java.net/openjfx/8/master/rt/file/2872be3a2984/modules/graphics/src/main/java/com/sun/javafx/tk/Toolkit.java