【问题标题】:JavaFx in headless mode无头模式下的 JavaFx
【发布时间】:2013-11-29 06:00:41
【问题描述】:

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

【问题讨论】:

    标签: javafx


    【解决方案1】:

    这是我如何在 Ubuntu linux 环境中使用 jetty 应用程序服务器解决服务器端图像生成问题的方法。它使用 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查看我的服务器端图像生成解决方案的详细信息。

    【讨论】:

      【解决方案2】:

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

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

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

      请参阅:Headless environment error in java.awt.Robot class with MAC OS

      【讨论】:

      • 这仅适用于 Swing 和 AWT,不适用于 JavaFX
      • 我自己试过了,它是 100% 工作的。也许您的情况有所不同。阅读共享的参考链接。
      【解决方案3】:

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

      这里也指出了这一点:JavaFX screencapture headless exception on OSX

      【讨论】:

        【解决方案4】:

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

        -Dtestfx.robot=glass -Dglass.platform=Monocle -Dmonocle.platform=Headless -Dprism.order=sw
        

        此外,您可能需要先安装 Monocle。请参阅Headless testing with JavaFx and TestFx 了解更多信息。

        【讨论】:

          【解决方案5】:

          我有一个可以交互使用的应用程序(显示 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&lt;String&gt; 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 环境。

          【讨论】:

            猜你喜欢
            • 2018-08-06
            • 2020-05-01
            • 1970-01-01
            • 1970-01-01
            • 2018-01-20
            • 2018-08-12
            • 1970-01-01
            • 1970-01-01
            • 2023-03-31
            相关资源
            最近更新 更多