8

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

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:.)

然后在上面的一个或另一个之后,他们会告诉你类似“编辑配置>码头>远程并输入本地主机,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),我可以远程登录到 1099,所以我知道 JVM 正在监听。(我们尽量不要担心这样一个事实,即打开一个端口,任何人都可以通过该端口通过网络将任意 java 代码安装到您的计算机上而无需密码)

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

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

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

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

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

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

编辑:感谢这个 google groups post我发现如果您不指定 Edit Configurations> + > jetty > remote,而是选择 Edit Configurations > + > remote,但调试和部署,则可以连接调试器是我所追求的,所以这只是一个一半的解决方案。

4

1 回答 1

6

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

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

在IDEA Jetty 远程运行配置Remote staging的选项卡部分:Server

  • 指定和Same file system_TypeHost
  • 在该部分的字段中指定<Jetty home>/contexts文件夹的路径Local pathcontexts

(如果您在 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>值应与JNDI portIDEA Jetty 运行配置字段中指定的相同

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

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

如果需要调试,还应该把从IDEA Jetty运行配置中获取的VM参数传递给Jetty进程:Startup/Connectiontab,选择Debuglist项下的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 
于 2013-02-12T14:43:59.947 回答