我在两个Linux系统之间的NetBeans IDE中设置了远程调试。远程调试没有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 = Antenna -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-校准-passwd文件: 连接到192.168.1.122:22 cmd:cd' / home / toma / NetBeansProjects // GUIFormExamples&#39 ;; ' /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变量,但是该程序执行了需要它的操作。 at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:207) 在java.awt.Window。(Window.java:535)
答案 0 :(得分:2)
您需要将DISPLAY环境变量导出添加到ant build xml文件中。我在博客上发表了关于这个问题的文章,它是my blog
的解决方案对于我的项目,有一个名为“-copy-to-remote-platform”的目标和两个宏:“runwithpasswd”和“runwithkey”在ANT build xml文件中需要进行一些修改。
我添加了“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;”在“命令”属性的开头。
答案 1 :(得分:1)
您需要使用X11转发,以使远程计算机上的GUI在您的计算机上可见(或以其他方式提供有效的DISPLAY环境变量,因此GUI可以在某处显示)。这是一个Linux配置问题,Java只是抱怨它无法创建GUI,因为(据他所知)没有可用的屏幕。
答案 2 :(得分:1)
成功!它并不像它应该的那么容易,但它确实有效。
在NetBeans(我使用的是版本8)中,为远程调试创建一个新的Java平台:工具 - &gt; Java平台 - &gt;添加平台 - &gt;远程Java标准版 - &gt; ...(有关详细信息,请参阅此链接:https://netbeans.org/kb/docs/java/javase-embedded.html)。按Debug(调试图标)上的下拉菜单(debug-remote)并观察输出窗口。
如果程序没有GUI,那么效果很好。 如果程序有GUI,我会收到这个错误:&#34; java.awt.HeadlessException:没有设置X11 DISPLAY变量,但是这个程序执行了一个需要它的操作&#34;
即使程序有GUI,上述步骤也会有所帮助,因为它会自动在远程服务器上部署程序。
要调试GUI,我发现的解决方法是使用ssh或VNC远程连接到服务器并以调试模式运行java程序:
java -Xdebug -Xrunjdwp:server = y,transport = dt_socket,address = 4000,suspend = y -jar&#34; /MyPath/Program.jar"。
Java VM应该暂停程序并等待NetBeans调试器连接。
在NetBeans中,在程序中设置断点并附加到远程进程:Debug - &gt;附加调试器 - &gt; Java Debugger,SocketAttach,dt_socket,服务器的IP地址,端口:4000 - &gt;行
稍后您可以按调试图标上的下拉菜单(附加到...)开始调试。
程序应运行到断点并暂停执行。您应该完全控制编程计算机上的GUI,但程序在服务器上执行。
在BeagleBone Black或Raspberry PI等单板计算机上调试Java程序时,这非常有用,这些计算机没有足够的马力来运行NetBeans。当单板计算机用于机器人应用并且需要接收传感器输入和控制电机时,这是必不可少的。
答案 3 :(得分:0)
解决方案:
答案 4 :(得分:0)
问题是NetBeans单引用您放入Exec Prefix字段的所有内容。因此,您可以使用自己的单引号来构造有效的bash命令。想象一下,你在显示器上有一个VNC虚拟桌面:2.0,你可以用它来欺骗它
One or more constraints have not been satisfied.
最后,这将导致一个工作bash命令字符串,带有引用的导出和带引号的sudo(没有坏处)。如果您不希望程序以超级用户模式运行,请将其更改为
export' DISPLAY=:2.0;'sudo
我发现只有sudo命令作为处理这些单引号的工作方式。