我想在无头的Jenkins上运行JavaFX的TestFX测试。一种方法是使用“StubToolkit”而不是QuantumToolkit,因为在无头模式下使用后者会给我一个“java.awt.AWTException:无头环境”异常。描述了StubToolkit here。
为了测试该过程,我想首先使用StubToolkit运行常规JavaFX应用程序。所以我......
内置OpenJFX(8),
使用gradle test
,
找到modules/graphics/build/classes/test/com/sun/javafx/pgstub/
下的StubToolkit类文件,
使用java jar cf StubToolkit.jar com
(来自modules/graphics/build/classes/test
目录)将它们放入jar中,
复制了我的示例JavaFX应用程序(MyApp.java
)旁边的jar和
使用java -cp "StubToolkit.jar;." -Djavafx.toolkit=com.sun.javafx.pgstub.StubToolkit MyApp
这给了我一个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上运行了所有这些测试。
任何想法有什么不对?我很感激任何帮助。
答案 0 :(得分:0)
有趣!使问题比通过Twitter更清晰:-)我很好奇如果手动尝试在应用程序中加载StubToolkit类会发生什么。
的Class.forName( “com.sun.javafx.pgstub.StubToolkit”)的newInstance();