无头模式下的JavaFx

无头模式下的JavaFx,javafx,Javafx,是否可以在无头模式下运行JavaFx(在Java7中)?它用于在服务器上生成图像,但要求使用X-server。JavaFx中是否存在类似java.awt.headless的东西?(我不能使用Xvfb)这是我在Mac OS中捕获图像时遇到的一种问题 我已经通过使用解决了这个问题 static { System.setProperty("java.awt.headless", "false"); } 请参阅参考资料:Shreyas的答案Dave不再为我工作了。虽然我不知道为什么,

是否可以在无头模式下运行JavaFx(在Java7中)?它用于在服务器上生成图像,但要求使用X-server。JavaFx中是否存在类似java.awt.headless的东西?(我不能使用Xvfb)

这是我在Mac OS中捕获图像时遇到的一种问题

我已经通过使用解决了这个问题

static {

        System.setProperty("java.awt.headless", "false");
}

请参阅参考资料:

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);
}

这里也指出了这一点:

下面是我如何在使用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

您可以在中查看我的服务器端映像生成解决方案的详细信息。

如果您有JavaFX应用程序的源代码,您还可以尝试使用TestFX以无头模式运行应用程序,以控制它并制作屏幕截图。要在headless模式下运行TestFX应用程序,必须使用以下JVM参数启动它(以启用):


此外,您可能需要先安装单片眼镜。有关更多信息,请参阅。

我有一个可以交互使用的应用程序(显示JavaFx对话框),但必须能够在服务器上运行非交互的应用程序,而无需显示。
即使在非交互模式下没有使用GUI元素,我们也得到了

    Caused by: java.lang.UnsupportedOperationException: Unable to open DISPLAY
    at com.sun.glass.ui.gtk.GtkApplication.<init>(GtkApplication.java:68)
  • 在主类
    AppExecution
    中,我创建了一个方法
    公共无效启动(列出参数){

    它解析参数并启动应用程序以进行交互式和非交互式执行

  • 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);
      }
    }
    
    作为请求非交互式执行的程序选项


  • 由于
    GuiAppExecution
    (它源自
    javafx.application.application
    )未为非交互式执行实例化,JavaFx环境未启动。

    这仅适用于Swing和AWT,而不是JavaFx。我自己尝试过,并且100%有效。可能您的案例有所不同。请阅读共享的参考链接。
    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);
      }
    }
    
    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";