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

Gus*_*Gus 8 remote-debugging jetty intellij-idea

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

java -Xdebug -Xrunjdwp:transport=dt_socket,address=51887,suspend=n,server=y
Run Code Online (Sandbox Code Playgroud)

一个答案建议使用像

-agentlib:jdwp:transport=dt_socket,address=51887,suspend=n,server=y
Run Code Online (Sandbox Code Playgroud)

但后来我明白了:

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:.)
Run Code Online (Sandbox Code Playgroud)

然后在上面的一个或另一个之后,他们告诉你类似"编辑配置>码头>远程并输入localhost,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\
Run Code Online (Sandbox Code Playgroud)

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

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

是的,我知道这是一个古老的码头版本

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

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

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

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

编辑:感谢这个谷歌小组的帖子我发现,如果你没有指定编辑配置> +> jetty> remote,可以连接调试器,而是选择编辑配置> +>远程,但调试和部署正是我所追求的只有半个解决方案.

Cra*_*der 6

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

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

在IDEA Jetty远程运行配置Remote stagingServer选项卡部分中:

  • 指定Same file system用于TypeHost
  • <Jetty home>/contextsLocal pathcontexts部分的字段中指定文件夹的路径

(如果您在另一台机器上运行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
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果需要调试,还应该传递给Jetty进程VM参数取自IDEA Jetty运行配置: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 
Run Code Online (Sandbox Code Playgroud)