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

8

我已经进行了一段时间的黑客和谷歌搜索,找到了几个看起来是针对旧版本IntelliJ和各种应用服务器编写的Stack Overflow线程。通常它们会告诉你输入

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

一个答案建议使用类似以下的内容

-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\

我也尝试过这样做,可以使用lsof看到被Java占用的1099端口,并且可以通过telnet连接到1099端口,所以我知道JVM正在侦听。(我们将尝试不担心这似乎是说,打开一个端口,任何人都可以在没有密码的情况下通过网络向您的计算机安装任意Java代码)。
然而,在Intellij中,每当我尝试部署和调试时,它会给我以下消息:

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

当我使用wireshark监视1099端口时,我可以看到java RMI通信(但它们是不可读的)。显然,这种通信对Intellij来说并不理想,所以我想知道是否有什么我需要做的来让Jetty与其良好地配合。请注意,目前更改Jetty版本不是一个选项,所以我们不要去那里 :)。
我还尝试过删除构件、禁用make,并尝试仅连接调试器,但它仍然给我相同的红色气球和错误消息,因此显然需要JNDI(端口1099)部分。
有人看到我做错了什么,或者知道其他我应该做的事情来使它工作吗?
(我想知道是否类似于这个问题:http://youtrack.jetbrains.com/issue/IDEA-65746 jboss问题) 编辑:感谢这个谷歌小组的帖子,我发现如果您不指定“编辑配置> + > jetty > 远程”,而是选择“编辑配置> + > 远程”,则可以连接调试器,但我想要的是调试和部署,所以这只是一个半解决方案。

我认为通过wireshark看到与1099的连接,排除了DNS问题的可能性。显然连接已经建立,但通信失败了。 - Gus
1个回答

6

Jetty的 远程 配置需要多个手动步骤,而如果您直接从IDEA使用 本地 配置启动Jetty,则会自动执行这些步骤。

如果您非常需要使用 远程 配置,请尝试以下步骤:

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

  • TypeHost设置为Same file system
  • contexts部分的Local path字段中指定路径到 <Jetty home>/contexts 文件夹

(如果您的Jetty运行在IDEA之外的另一台机器上,则设置将有所不同,但我假设在您的情况下它是相同的机器)

将以下虚拟机参数传递给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端口>的值应该与IDEA Jetty运行配置中JNDI端口字段中指定的值相同。

将以下配置文件传递给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 

1
发现我不需要指定org.mortbay.start.Main。这很好用,谢谢! - Gus
尝试使用本地配置运行Jetty,但一直出现“未包含主文件”的错误。 - Shwetanka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接