【问题标题】:Remote Debugging GUI Java Application (swing) in NetBeans 8NetBeans 8 中的远程调试 GUI Java 应用程序 (swing)
【发布时间】:2014-12-11 09:28:55
【问题描述】:

我在 NetBeans IDE 中设置了 2 个 Linux 系统之间的远程调试。远程调试没有 GUI 的应用程序可以正常工作,但是当我尝试远程调试具有 swing GUI 的应用程序时出现此错误:

线程“AWT-EventQueue-0”中的异常 java.awt.HeadlessException: 没有设置 X11 DISPLAY 变量,但是这个程序执行了一个需要它的操作。

我将不胜感激任何建议!

NetBeans 输出窗口:

ant -f /home/toma/NetBeansProjects/GUIFormExamples -Dremote.platform.password=***** -Dremote.platform.rp.target=linux-15 -Dremote.platform.java.spec.ver=17 -Dremote.platform.rp.filename=linux -Ddebug.class=天线 -Dnb.internal.action.name=debug debug-remote 在里面: 删除:/home/toma/NetBeansProjects/GUIFormExamples/build/built-jar.properties deps-jar: 更新属性文件:/home/toma/NetBeansProjects/GUIFormExamples/build/built-jar.properties 编译: 将 1 个文件复制到 /home/toma/NetBeansProjects/GUIFormExamples/build 将库复制到 /home/toma/NetBeansProjects/GUIFormExamples/dist/lib。 要在没有 Ant 的情况下从命令行运行此应用程序,请尝试: java -jar“/home/toma/NetBeansProjects/GUIFormExamples/dist/GUIFormExamples.jar” 罐: 连接到 192.168.1.122:22 连接到 192.168.1.122:22 cmd : mkdir -p '/home/toma/NetBeansProjects//GUIFormExamples/dist' 连接到 192.168.1.122:22 完毕。 配置文件-rp-calibrate-passwd: 连接到 192.168.1.122:22 cmd : cd '/home/toma/NetBeansProjects//GUIFormExamples'; '/usr/lib/jvm/j2sdk1.7-oracle/jre/bin/java' -Xdebug -Xrunjdwp:transport=dt_socket,address=localhost:39245 -Dfile.encoding=UTF-8 -jar /home/toma/NetBeansProjects //GUIFormExamples/dist/GUIFormExamples.jar 线程“AWT-EventQueue-0”中的异常 java.awt.HeadlessException: 没有设置 X11 DISPLAY 变量,但该程序执行了需要它的操作。 在 java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:207) 在 java.awt.Window.(Window.java:535)

【问题讨论】:

  • 错误消息告诉您JVM 尝试使用X11 服务器进行图形处理,但您没有告诉它在哪里可以找到它。由于您在 Linux 系统上,您可能希望告诉它使用在您的开发机器上运行的 X11 服务器 - 配置的确切方式取决于系统。

标签: java swing user-interface netbeans remote-debugging


【解决方案1】:

您需要将 DISPLAY 环境变量导出添加到您的 ant 构建 xml 文件中。我已经在博客上讨论过这个问题,它的解决方案在 my blog

对于我的项目,有一个名为“-copy-to-remote-platform”的目标和两个宏:ANT 构建 xml 文件中的“runwithpasswd”和“runwithkey”,需要进行一些修改。

我添加了“export DISPLAY=:0;”在上述每个宏中最后一个 sshexec 命令,使它们看起来像这样:

<sshexec host="${remote.platform.host}" port="${remote.platform.port}" username="${remote.platform.user}" password="${remote.platform.password}" trust="true" usepty="true"
                    command="export DISPLAY=:0; cd '${remote.project.dir}'; ${remote.platform.exec.prefix}'${remote.java.executable}' @{additionaljvmargs} -Dfile.encoding=${runtime.encoding} ${run.jvmargs} ${run.jvmargs.ide} -jar ${remote.dist.jar} ${application.args}"/>

注意“export DISPLAY=:0;”在“命令”属性的开头。

【讨论】:

  • 请将您的解决方案放在这里。
  • 我已编辑我的评论以使其更有用。我想知道是否有任何那些拒绝投票、标记删除的 stackoverflow 治安官,他们的胸膛里装满了哦-我-太重要-徽章了,是否努力检查我的解决方案是否有效;)
  • 我已经更新了我博客的链接——它现在指向这篇文章
【解决方案2】:

您需要使用 X11 转发,以使远程计算机上的 GUI 在您的计算机上可见(或者以其他方式提供有效的 DISPLAY 环境变量,以便 GUI 可以在某处显示)。这是一个 Linux 配置问题,Java 只是抱怨它无法创建 GUI,因为(据它所知)没有可用的屏幕。

【讨论】:

  • 感谢您的回答!您能否提供有关如何“使用 X11 转发,使远程计算机上的 GUI 可见”的更多详细信息?我可以使用 SSH 远程运行该程序,但我无法同时远程运行该程序并进行调试。
  • 我认为解决这个问题的关键是能够在 NetBeans 开始远程调试之前运行一个脚本来设置 DISPLAY 变量:export DISPLAY=:0.0
  • 您可以尝试在 .bashrc 或类似文件中设置 DISPLAY,看看它是否有效(然后尝试想一个更聪明的解决方案)。您应该格式化输出,因为现在很难看到在做什么。
  • Kayaman,感谢您的建议!它帮助我找到了解决方案并将答案放在了下面。
【解决方案3】:

成功!这并不像应有的那么简单,但它确实有效。

在 NetBeans(我使用版本 8)中创建一个用于远程调试的新 Java 平台:工具 -> Java 平台 -> 添加平台 -> 远程 Java 标准版 -> ...(有关更多信息,请参阅此链接:@987654321 @)。按调试图标(debug-remote)上的下拉菜单并观察输出窗口。

如果程序没有图形用户界面,这很好用。 如果程序有 GUI,我会收到此错误:“java.awt.HeadlessException:未设置 X11 DISPLAY 变量,但该程序执行了需要它的操作”

即使程序有 GUI,上述步骤也会有所帮助,因为它会自动在远程服务器上部署您的程序。

要调试GUI,我找到的解决方法是使用ssh或VNC远程连接到服务器并在调试模式下运行java程序:

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=y -jar "/MyPath/Program.jar"。

Java VM 应该暂停程序并等待 NetBeans 调试器连接。

在NetBeans中,在程序中设置断点并附加到远程进程:Debug -> Attach Debugger -> Java Debugger, SocketAttach, dt_socket, 服务器IP地址,端口:4000 -> OK

稍后您只需按调试图标(附加到...)上的下拉菜单即可开始调试。

程序应该运行到断点并暂停执行。您应该完全控制编程计算机上的 GUI,但程序是在服务器上执行的。

当在 BeagleBone Black 或 Raspberry PI 等没有足够马力来运行 NetBeans 的单板计算机上调试 Java 程序时,这非常有用。当单板计算机用于机器人应用并且需要接收传感器输入和控制电机时,这一点至关重要。

【讨论】:

    【解决方案4】:

    解决方案:

    1. 转到运行 → 设置项目配置 → 自定义..
    2. 点击管理平台
    3. 为您的 RPI 选择远程配置
    4. 在正确的视线上转到 Exec Prefix 并在其中写入 startx。

    【讨论】:

      【解决方案5】:

      问题是 NetBeans 将您放入 Exec Prefix 字段的所有内容都单引号引起来。所以你可以用自己的单引号来构造一个有效的 bash 命令。想象一下,你有一个 VNC 虚拟桌面在 display :2.0,你可以用 export' DISPLAY=:2.0;'sudo 最后,这将产生一个带引号的导出和带引号的 sudo 的工作 bash 命令字符串(这没有害处)。如果您不希望您的程序在超级用户模式下运行,请将其更改为 export' DISPLAY=:2.0;sudo -u 'pi 我发现只有 sudo 命令可以作为处理这些单引号的有效方法。

      【讨论】:

        猜你喜欢
        • 2017-03-11
        • 2015-02-06
        • 2010-11-01
        • 1970-01-01
        • 2014-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多