是否可以在无头模式下运行JavaFx(在Java 7中)?它用于在服务器上生成图像,但是要求使用X-Server。在JavaFx中是否存在类似java.awt.headless的东西?(我不能使用Xvfb)
答案 0 :(得分:2)
以下是我在使用jetty应用服务器的Ubuntu linux环境中解决服务器端图像生成问题的方法。它使用xvfb但仅作为"库" - 服务器上没有任何其他特殊操作:
apt-get install xvfb
// then on application server start:
export DISPLAY=":99"
start-stop-daemon --start --background --user jetty --exec "/usr/bin/sudo" -- -u jetty /usr/bin/Xvfb :99 -screen 0 1024x768x24
您可以在this SO question中查看我的服务器端图像生成解决方案的详细信息。
答案 1 :(得分:1)
Shreyas Dave的回答不再对我有用了。虽然我不知道为什么,但这就是我所做的:
public static void main(String[] args) {
// to avoid
// [JRSAppKitAWT markAppIsDaemon]: Process manager already initialized: can't fully enable headless mode.
System.setProperty("javafx.macosx.embedded", "true");
java.awt.Toolkit.getDefaultToolkit();
// end
launch(args);
}
答案 2 :(得分:0)
这是我在Mac OS中捕获图像时遇到的一个问题。
我已使用
解决了这个问题static {
System.setProperty("java.awt.headless", "false");
}
参见参考:Headless environment error in java.awt.Robot class with MAC OS
答案 3 :(得分:-1)
如果你有JavaFX应用程序的源代码,你也可以尝试使用TestFX以无头模式运行应用程序,控制它并制作屏幕截图。要在无头模式下运行TestFX应用程序,必须使用以下JVM参数启动它(以启用Monocle):
-Dtestfx.robot=glass -Dglass.platform=Monocle -Dmonocle.platform=Headless -Dprism.order=sw
此外,您可能需要先安装Monocle。有关详细信息,请参阅Headless testing with JavaFx and TestFx。
答案 4 :(得分:-1)
我有一个可以交互使用的应用程序(显示JavaFx对话框),但也必须能够在没有显示的服务器上运行非交互式。
即使在非交互模式下没有使用GUI元素,我们也得到了
Caused by: java.lang.UnsupportedOperationException: Unable to open DISPLAY
at com.sun.glass.ui.gtk.GtkApplication.<init>(GtkApplication.java:68)
一旦从javafx.application.Application
派生的类被实例化,就会发生这种情况,这通常与您的主类有关。
以下是解决问题的方法:
我创建了一个额外的课程GuiAppExecution
:
import java.util.List;
import javafx.application.Application;
import javafx.stage.Stage;
/**
* JavaFx launch class for {@link AppExecution}.
*/
public class GuiAppExecution extends Application {
@Override
public void start(Stage stage) throws Exception {
List<String> parameters = getParameters().getRaw();
AppExecution appExecution = new AppExecution();
appExecution.launch(parameters);
}
/**
* Launches the {@link AppExecution} as JavaFx {@link Application}.
*
* @param parameters program parameters
*/
public void launchGui(String[] parameters) {
launch(parameters);
}
}
在主班AppExecution
中,我创建了一个方法
public void launch(List<String> parameters) {
它解析参数并启动交互式和非交互式执行的应用程序。
main
方法如下所示:
public static void main(String[] parameters) {
List<String> parameterList = Arrays.asList(parameters);
if (parameterList.stream().anyMatch(p -> p.equalsIgnoreCase(BATCH_PARAMETER))) {
AppExecution appExecution = new AppExecution();
appExecution.launch(parameterList);
}
else {
GuiAppExecution guiAppExecution = new GuiAppExecution();
guiAppExecution.launchGui(parameters);
}
}
与
private static final String BATCH_PARAMETER = "-batch";
作为请求非交互式执行的程序选项。
由于GuiAppExecution
(派生自javafx.application.Application
)未实例化以进行非交互式执行,因此未启动JavaFx环境。