使用 IntelliJ 12 部署和调试远程 Jetty
Posted
技术标签:
【中文标题】使用 IntelliJ 12 部署和调试远程 Jetty【英文标题】:Deploy & Debug remote Jetty with IntelliJ 12 【发布时间】:2013-01-27 08:18:12 【问题描述】:我已经在 hacking 和谷歌上搜索了一段时间,我发现了几个 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:.)
然后在上面的一个或另一个之后,他们会告诉你类似“编辑配置>码头>远程并输入本地主机,51887”(端口号不同)
但是在 12 中,您选择远程后登陆的页面有很多选项,并且在另一个选项卡上询问 JNDI 端口,而不是 jdwp 端口,它实际上建议了上面的 jdwp 参数。
研究 JNDI 端口位,通常会产生将这样的 args 添加到命令行的指令...
-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),我可以远程登录到 1099,所以我知道 JVM 正在侦听。 (我们会尽量不担心这样一个事实,即打开一个端口,任何人都可以通过该端口通过网络将任意 java 代码安装到您的计算机上而无需密码)
但是,在 Intellij 中,每当我尝试部署和调试时,它都会给我以下消息:
当我使用wireshark 窥探端口1099 时,我可以看到超过1099 的java RMI 通信(但它们难以辨认)。显然,Intellij 的通信并不令人满意,所以我想知道我是否需要对 Jetty 做些什么才能让它发挥得更好。请注意,目前无法选择更改 Jetty 版本,所以我们不要去那里:)。
我还尝试删除工件、禁用 make 并尝试仅连接调试器,但它仍然给我相同的红色气球和错误消息,因此显然需要 JNDI(端口 1099)部分。
有没有人看到我做错了什么,或者知道我应该做些什么来让它工作?
(我想知道是不是和这个类似:http://youtrack.jetbrains.com/issue/IDEA-65746jboss issue)
编辑:感谢this google groups post,我发现如果您不指定编辑配置> + >码头>远程,则可以连接调试器,而是选择编辑配置> + > 远程,但调试和部署是我所追求的,所以这只是解决方案的一半。
【问题讨论】:
我认为我看到通过wireshark 连接到1099 的事实消除了DNS 问题的可能性。显然已建立连接,但通信失败 【参考方案1】:Jetty remote
配置需要几个手动步骤,当您直接从 IDEA 使用 local
配置启动 Jetty 时,这些步骤会自动执行。
如果您绝对必须使用remote
配置,请尝试以下步骤:
在 IDEA Jetty 远程运行配置的Server
选项卡的Remote staging
部分中:
Type
和Host
指定Same file system
在contexts
部分的Local path
字段中指定<Jetty home>/contexts
文件夹的路径
(如果您在 IDEA 以外的另一台机器上运行 Jetty,设置会有所不同,但我认为在您的情况下它是同一台机器)
将以下 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运行配置中获取的VM参数传递给Jetty进程:Startup/Connection
选项卡,选择To debug remote server JVM ...
下的Debug
列表项
这是使用所有必需选项启动 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
【讨论】:
发现我不需要指定org.mortbay.start.Main。效果很好,谢谢! 尝试使用本地配置运行码头并不断得到“不包括主文件”。以上是关于使用 IntelliJ 12 部署和调试远程 Jetty的主要内容,如果未能解决你的问题,请参考以下文章
图文并茂教你学会使用 IntelliJ IDEA 进行远程调试
IntelliJ IDEA 在远程机器或者 Docker 上面运行和调试你的程序