部署&使用IntelliJ 12调试远程Jetty

时间:2013-02-12 04:47:20

标签: intellij-idea jetty remote-debugging

我一直在黑客攻击和谷歌搜索一段时间,我发现了几个statck溢出线程,似乎它们是为旧版本的intellij编写的,带有各种应用程序服务器。通常他们会告诉你输入

java -Xdebug -Xrunjdwp:transport=dt_socket,address=51887,suspend=n,server=y

One answer建议使用类似

的内容
-agentlib:jdwp:transport=dt_socket,address=51887,suspend=n,server=y

但后来我明白了:

Error occurred during initialization of VM
Could not find agent library: libjdwp:transport.jnilib (searched /Library/Java/JavaVirtualMachines/1.6.0_37-b06-434.jdk/Contents/Libraries:/System/Library/Java/Extensions:/Library/Java/Extensions:.)

然后在上面的一个或另一个之后,他们会告诉你类似“编辑配置> jetty>远程并输入localhost,51887”(端口号不同)

然而在12中,您选择远程后登陆的页面有很多选项,并且要求JNDI端口,而不是另一个选项卡上的jdwp端口,它实际上建议上面的jdwp参数。

研究JNDI端口位,通常会产生指令,将这样的参数添加到命令行...

-Dcom.sun.management.jmxremote= \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false\

我也是这样做的,我可以看到java保存的端口1099(使用lsof),我可以telnet到1099,所以我知道JVM正在监听。 (我们尽量不要担心,这似乎就是说,打开一个端口,任何人都可以通过网络在没有密码的情况下通过网络安装任意java代码)

然而,在Intellij中,每当我尝试部署和调试它时,都会给出以下消息:

Yes, I know it's an ancient version of jetty

当我使用wireshark窥探端口1099时,我可以看到1099以上的Java RMI通信(但它们难以辨认)。显然,Intellij的通信并不令人满意,所以我想知道我是否需要对Jetty做些什么才能让它发挥得淋漓尽致。请注意,改变Jetty版本目前不是一个选项,所以我们不要去那里:)。

我也尝试删除工件,禁用make,并尝试连接调试器,但它仍然给我相同的红色气球和错误消息,所以显然需要JNDI(端口1099)部分。

有没有人看到我做错了什么,或者知道我应该做些什么才能让它发挥作用?

(我想知道它是否与此类似:http://youtrack.jetbrains.com/issue/IDEA-65746 jboss问题)

修改:感谢this google groups post我发现如果您未指定编辑配置>可以连接调试器。 +>码头>远程,而是选择编辑配置> +>远程,但调试和部署是我所追求的,所以这只是一半的解决方案。

1 个答案:

答案 0 :(得分:6)

Jetty remote配置需要几个手动步骤,当您使用local配置直接从IDEA启动Jetty时,会自动执行这些步骤。

如果您绝对必须使用remote配置,请尝试以下步骤:

在IDEA Jetty远程运行配置的Remote staging标签的Server部分中:

  • Same file systemType
  • 指定Host
  • 指定<Jetty home>/contexts部分Local path字段中contexts文件夹的路径

(如果您在另一台机器上运行Jetty而不是IDEA,则设置会有所不同,但我认为在您的情况下它是同一台机器)

将以下VM参数传递给Jetty进程:

-Dcom.sun.management.jmxremote=
-Dcom.sun.management.jmxremote.port=<JNDI port>
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-DOPTIONS=jmx

<JNDI port>值应与IDEA Jetty运行配置的JNDI port字段中指定的值相同

将以下配置文件传递给Jetty进程(在命令行中):

  • etc/jetty-jmx.xml
  • etc/jetty.xml

如果您需要调试,您还应该传递给从IDEA Jetty运行配置获取的Jetty进程VM参数:Startup/Connection选项卡,选择Debug To debug remote server JVM ...列表项>

以下是使用所有必需选项启动Jetty进程的示例命令行:

java -Xdebug -Xrunjdwp:transport=dt_socket,address=60208,suspend=n,server=y -DSTOP.PORT=0 -Dcom.sun.management.jmxremote= -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -DOPTIONS=jmx -Dfile.encoding=UTF-8 -classpath start.jar etc/jetty-jmx.xml etc/jetty.xml 
相关问题