【问题标题】:Deploy JavaFX on Ubuntu server without display在没有显示的 Ubuntu 服务器上部署 JavaFX
【发布时间】:2014-02-05 09:29:21
【问题描述】:

我正在 Netbeans 的 Mac OS X (10.9.1) 上使用 jdk1.7.0_51 开发 JavaFX 应用程序。我可以毫无问题地运行它,并且在干净构建之后,我还可以从 dist/ 文件夹启动 jar。

现在我想将它部署在 64 位 Ubuntu 13.04 服务器上。我在这样做时遇到了很多问题,但最终将服务器设置为拥有正确的 JRE、字体和库。运行 jar 导致错误比我的代码更深(转到 UnsatisfiedLinks 到提到 MACOS 的本机库),所以我认为最好将我的应用程序打包在 Ubuntu 本身上。我最终安装了 NetBeans 来创建一个新的(本机)JavaFX 项目,并使用 sftp 从我的机器上传了 src/ 和 lib/ 文件夹。在 NetBeans 中通过重建的项目运行代码可以正常工作,但在运行期间我在控制台中收到警告:

libGL error: failed to load driver: swrast
libGL error: Try again with LIBGL_DEBUG=verbose for more details.
Prism-ES2 Error : GL_VERSION (major.minor) = 1.4

无论如何,应用程序确实会运行。干净构建后,我可以类似地从 dist/ 文件夹运行 jar。终端中出现相同的警告,但随后应用程序启动。

但是,如果我 ssh 到没有 -X 标志的服务器并尝试运行应用程序,我会得到以下信息:

Failed in XOpenDisplay
(java:29341): Gtk-WARNING **: cannot open display: 

但是,我的应用程序没有 UI。它只是将 JavaFX 用于 WebEngine(这是必需的,不能更改)。我想知道是否有人知道(如果是,如何)可以在没有显示的情况下启动我的 JavaFX jar(仅作为服务器上的守护进程运行)。

亲切的问候, 最重要的

编辑:

我已经尝试过这里描述的一些东西:Java Can't connect to X11 window server using 'localhost:10.0' as the value of the DISPLAY variable

You need to specify the -Djava.awt.headless=true parameter at startup time.

(假设我使用命令 java -Djava.awt.headless=true -jar MyApp.jar 正确执行此操作),这没有产生任何结果(发生相同的错误)。

export DISPLAY=:0

仍然没有结果,尽管错误显然略有变化,现在阅读:

(java:30765): Gtk-WARNING **: cannot open display: :0

最后我也尝试了以下方法:

unset DISPLAY

这导致了最初的错误(显然没有设置 DISPLAY)。

【问题讨论】:

    标签: java ubuntu ssh javafx x11


    【解决方案1】:

    我认为 JavaFX 2.x 不支持在无头模式下运行。我不知道任何解决方法。

    有关更多信息,请参阅 JavaFX 问题跟踪器功能请求:RT-34241 Use of WebEngine in a headless system,目前计划在 Java 9 中实施。

    【讨论】:

    • 虽然这是个不幸的消息,但感谢您的回复,我相信这回答了我的问题。
    【解决方案2】:

    我遇到了几乎同样的问题

    Failed in XOpenDisplay
    (java:2593): Gtk-WARNING **: cannot open display:
    

    Travis CI 的无头 Ubuntu docker 容器中为我的 JavaFX 应用程序运行单元测试时。

    解决方案是在容器中安装 X Virtual Framebuffer (xvfb) 以通过 .travis.yml 中的容器配置更改来模拟显示呈现

    before_script:
      - "export DISPLAY=:99.0"
      - "sh -e /etc/init.d/xvfb start"
      - sleep 3 # give xvfb some time to start
    

    这允许 JavaFX 成功初始化其核心并创建 JavaFX 组件,而无需实际在屏幕上显示它们。

    在文章Using xvfb to Run Tests That Require a GUI 中查看此解决方案的详细信息

    【讨论】:

    • 为什么这被否决了?这不起作用吗?这个解决方案似乎完全合理。
    • +1 因为这是一个不错的选择。我怀疑这对所有 Linux 来说都是通用的。我正在为 RHEL/Centos 部署并遇到同样的问题。我在 matplotlib 上遇到了类似的问题,并使用 hacky 代码解决了这个问题。也许对此进行概括会有所帮助?我接下来使用 JFX... :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多