【问题标题】:Client server GUI resources客户端服务器 GUI 资源
【发布时间】:2014-05-09 16:20:08
【问题描述】:

抱歉,问题很短,解释很长。

我的本地 Clojure 程序运行良好并使用 GUI 控件,但是当从服务器运行时,它会失败。你能帮忙吗?

我一直在无头 Ubuntu (14.04) 服务器上测试 Clojure 示例代码。我在 LightTable 中运行程序,然后将 LT 连接到 Ubuntu repl 再次运行它们。

不适合我的程序是在本机 OS X 中打开文件选择器对话框,以便我可以将文档上传到服务器。我的 Macbook 找到的某些 GUI 资源似乎没有被服务器程序找到。我让它工作了一次,一个小时,我使用的网站找到了这个功能,没问题。

我觉得我已经进入了地狱般的状态,试图让这个示例工作,我真的需要它来工作。

我有 VirtualBox 扩展包,应该提供 VRDE。

我尝试了不同的服务器启动选项和 ssh 选项。如果我设置环境变量,我的客户端程序将无法使用这些详细信息。

对我来说最糟糕的是,它确实奏效了——一次。我使工作更改永久化的努力再次打破了它。尽管恢复了快照并恢复了我的 Macbook,但我无法再让此设置正常工作。

简而言之,在客户端运行的 GUI 程序在从服务器运行时会遇到问题。请帮忙。我被困了好几天了。

我不知道它是否有帮助,但我已经安装了 Xauth 和 Webmin。 Webmin 被描述为“用于 Linux 的基于 Web 的 GUI 管理工具”。

有人建议我使用 Java WebStart,但我读到它已包含在内并自动使用。在进一步调查它时,我看不到解决方案。

我提供了从 LightTable 复制的完整错误消息,以防您对我有所帮助:

**java.awt.HeadlessException: 
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
GraphicsEnvironment.java:207 java.awt.GraphicsEnvironment.checkHeadless
          Window.java:535 java.awt.Window.<init>
           Frame.java:420 java.awt.Frame.<init>
           Frame.java:385 java.awt.Frame.<init>
          JFrame.java:174 javax.swing.JFrame.<init>
         (Unknown Source) com.ociweb.swing.proxy$javax.swing.JFrame$ActionListener$c1f703.<init>
         (Unknown Source) com.ociweb.swing$eval7839.invoke
       Compiler.java:6703 clojure.lang.Compiler.eval
       Compiler.java:6666 clojure.lang.Compiler.eval
            core.clj:2927 clojure.core/eval
              eval.clj:77 lighttable.nrepl.eval/->result
             AFn.java:156 clojure.lang.AFn.applyToHelper
             AFn.java:144 clojure.lang.AFn.applyTo
             core.clj:626 clojure.core/apply
            core.clj:2468 clojure.core/partial[fn]
          RestFn.java:408 clojure.lang.RestFn.invoke
            core.clj:2559 clojure.core/map[fn]
          LazySeq.java:40 clojure.lang.LazySeq.sval
          LazySeq.java:49 clojure.lang.LazySeq.seq
              RT.java:484 clojure.lang.RT.seq
             core.clj:133 clojure.core/seq
            core.clj:2595 clojure.core/filter[fn]
          LazySeq.java:40 clojure.lang.LazySeq.sval
          LazySeq.java:56 clojure.lang.LazySeq.seq
             Cons.java:39 clojure.lang.Cons.next
          LazySeq.java:81 clojure.lang.LazySeq.next
              RT.java:598 clojure.lang.RT.next
              core.clj:64 clojure.core/next
            core.clj:2856 clojure.core/dorun
            core.clj:2871 clojure.core/doall
             eval.clj:126 lighttable.nrepl.eval/eval-clj
          RestFn.java:442 clojure.lang.RestFn.invoke
            sonar.clj:215 lighttable.nrepl.sonar/eval5355[fn]
             AFn.java:152 clojure.lang.AFn.applyToHelper
             AFn.java:144 clojure.lang.AFn.applyTo
             core.clj:624 clojure.core/apply
            core.clj:1862 clojure.core/with-bindings*
          RestFn.java:425 clojure.lang.RestFn.invoke
            sonar.clj:203 lighttable.nrepl.sonar/eval5355[fn]
         MultiFn.java:227 clojure.lang.MultiFn.invoke
              core.clj:98 lighttable.nrepl.core/queued[fn]
            core.clj:2402 clojure.core/comp[fn]
interruptible_eval.clj:138 clojure.tools.nrepl.middleware.interruptible-eval/run-next[fn]
              AFn.java:22 clojure.lang.AFn.run
ThreadPoolExecutor.java:1145 java.util.concurrent.ThreadPoolExecutor.runWorker
ThreadPoolExecutor.java:615 java.util.concurrent.ThreadPoolExecutor$Worker.run
          Thread.java:744 java.lang.Thread.run**

【问题讨论】:

  • 您能否详细描述一下您是如何启动在服务器上提供 repl 的进程的,我可以假设您通过 SSH 登录并运行 leiningen 吗?
  • 你是对的!我启动一个无头 Ubuntu 服务器,然后启动 ssh Core - 服务器主机名。我运行 lein repl,指定主机和端口。然后我在 LightTable 中使用这些细节,将我的示例代码粘贴到... schtooops!如果我设置 DISPLAY 变量,它只会引发类似但不同的错误。
  • “打开文件选择器对话框”。此时您究竟希望在无头服务器上发生什么?

标签: ubuntu user-interface clojure x11 headless


【解决方案1】:

我对您的设置了解不多,无法给出解释,但我之前遇到过这个错误,使用 -Djava.awt.headless=true 运行 java/clojure 解决了这个问题。 请参阅here 了解更多信息。

【讨论】:

  • 感谢您的回复。我以前在我的 Clojure 项目中将其作为 - :jvm_opts ["-Djava.awt.headless=true"] 但是,它没有任何区别。不过,我会将其保留在 project.clj 中。
【解决方案2】:

如果您希望远程 lein 能够在本地系统上打开窗口,您可以

ssh -X core.domain.com 
lein repl ....

这将导致远程服务器创建的任何窗口通过 SSH 连接返回到您的桌面。尽管只要您保持 SSH 连接处于活动状态。

【讨论】:

  • 我一直在这样做,但没有成功。
  • 我现在似乎可以使用它。我设法让一个示例程序启动一个 OS X 本机对话框。为此,我必须创建 xfvb 服务,并将 /etc/ennvironment/DISPLAY 变量设置为我的服务器 IP 地址。启动 Tomcat 后,我​​启动了一个 repl,并将 LT 打开到同一个 repl。一切正常,所以问题解决了!
猜你喜欢
  • 1970-01-01
  • 2018-08-16
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多