JavaFX - 引起:java.lang.UnsupportedOperationException:无法打开DISPLAY?

rom*_*rsp 6 java linux javafx deb

我正在使用jdeb为基于debian的发行版生成我的.deb安装程序.应用程序安装时没有错误,但是当我尝试运行service myapp start它失败时出现以下异常(应用程序继续运行但FX场景永远不会显示):

2016-12-30 11:19:51,468 [main] INFO  o.s.c.s.DefaultLifecycleProcessor - Starting beans in phase 0
Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:58)
Caused by: java.lang.UnsupportedOperationException: Unable to open DISPLAY
    at com.sun.glass.ui.gtk.GtkApplication.<init>(GtkApplication.java:68)
    at com.sun.glass.ui.gtk.GtkPlatformFactory.createApplication(GtkPlatformFactory.java:41)
    at com.sun.glass.ui.Application.run(Application.java:146)
    at com.sun.javafx.tk.quantum.QuantumToolkit.startup(QuantumToolkit.java:257)
    at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:211)
    at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:675)
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:695)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
    at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)

同时,如果我只是运行sudo /etc/init.d/myapp start它运行没有错误,我的第一个FX场景显示.

Bellow是我对jdeb的maven配置:

<plugin>
    <artifactId>jdeb</artifactId>
    <groupId>org.vafer</groupId>
    <version>1.5</version>

    <executions>
        <execution>
            <id>appassembler</id>
            <phase>package</phase>
            <goals>
                <goal>jdeb</goal>
            </goals>
            <configuration>
                <deb>${project.build.directory}/${project.build.finalName}.deb</deb>
                <snapshotExpand>false</snapshotExpand>
                <!-- expand "SNAPSHOT" to what is in the "USER" env variable -->
                <snapshotEnv>USER</snapshotEnv>
                <verbose>true</verbose>
                <controlDir>${basedir}/src/deb/control</controlDir>
                <dataSet>
                    <data>
                        <src>${project.build.directory}/${project.build.finalName}-uber.jar</src>
                        <type>file</type>
                        <mapper>
                            <type>perm</type>
                            <prefix>/opt/stone/${project.build.finalName}</prefix>
                            <filemode>755</filemode>
                            <user>root</user>
                            <group>root</group>
                        </mapper>
                    </data>
                    <data>
                        <src>src/deb/upstart/${project.build.finalName}.conf</src>
                        <type>file</type>
                        <mapper>
                            <type>perm</type>
                            <prefix>/opt/stone/${project.build.finalName}</prefix>
                            <filemode>755</filemode>
                            <user>root</user>
                            <group>root</group>
                        </mapper>
                    </data>
                </dataSet>
            </configuration>
        </execution>
    </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

这是我的安装后脚本:

#!/bin/bash

echo Creating symblink...
sudo ln -s /opt/stone/acs/acs-uber.jar /etc/init.d/acs

echo Creating service...
sudo update-rc.d acs start 98 5 .

echo Starting service...
sudo service acs restart
Run Code Online (Sandbox Code Playgroud)

小智 2

引用其他地方的答案,该答案对我在 Ubuntu 上使用 javafx 作为 root 有用......也许这可以帮助其他人。我和你有同样的问题,但对于普通用户。假设我想使用用户帐户 foo 启动 Firefox。我以 bar 身份登录:

[bar@localhost ~]$ sudo -u foo -H firefox

遗憾的是,该命令失败,并出现与问题中相同的错误(即未指定协议且无法打开显示)

我的解决方案是简单地将用户 foo 添加到 X 服务器的授权访问列表中。

xhost si:本地用户:foo

就这样,我可以使用 sudo 和用户 foo 启动 Firefox(和其他 X 应用程序)。