IDEA远程部署和调试

Wanjiongming 于 2020-11-15 发布

自动部署

配置:Tools-Deployment

  1. 若不勾选 Visible only for this project,则添加的服务器是所有项目里都能使用

  2. Mappings 上传规则.本地目录里的文件上传到服务器的哪个目录。这个配置是和项目绑定的,即使你的但是不用担心,里面配置的 Mappings 是只对当前项目有效的

  3. Exclude Paths 同上

  4. Automatic Upload 自动上传,当 Mappings 中的文件改变后,自动上传到服务器,比较适合 web 资源。注意被标记为 exclude 的目录是无法监听变化的,比如 Java 项目的 out 目录,因此无法自动上传,只能手动上传

  5. 手动上传只会上传当前选中的且在 Mappings 中的文件。所以一般是在最外面的文件夹上右键 Deployment

远程 Debug

添加 Run Configuartions 选择 Remote。选择 Attach to remote JVM,协议选择 Socket,输入端口后会生成一串运行配置,添加到你的程序的启动参数中即可

Spring 项目

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=50000 -jar web.jar

tomcat 则需修改启动参数,在 catalina.sh 第一行添加如下代码即可

CATALINA_OPTS="$CATALINA_OPTS -agentlib:jdwp=transport=dt_socket,address=50000,suspend=n,server=y"

远程部署 Tomcat

IDEA 控制 Tomcat 是通过 JMX 来操作 Tomcat 的 MBeanServer,动态添加 Context,实现应用的启动与部署,因此需要先开启 JMX。另外 JMX 常用于做监控,比如使用 Java Mission Control 进行服务器监控。

01.png

在 catalina.sh 中的第一行添加如下配置

一开始没有加-Dcom.sun.management.jmxremote.rmi.port=51234这一行在 IDEA 中连接的老是失败,然后把防火墙全放开就好了。查阅后才知道 JMX 在远程连接时,还会会随机开启一个 RMI 端口作为连接的数据端口,在 Java7u25 版本后可可以设置-Dcom.sun.management.jmxremote.rmi.port来配置这个端口,有意思的是你可将 jmx 和 rmi 的端口设置为同一个。另外-Djava.rmi.server.hostname和你连接的 IP 必须是一致的,如果是通过公网连接,这里就需要配置为真实的公网 IP。

CATALINA_OPTS="$CATALINA_OPTS \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=51234 \
-Dcom.sun.management.jmxremote.rmi.port=51234 \
-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-agentlib:jdwp=transport=dt_socket,address=50000,suspend=n,server=y"

在 IDEA 的 Run Configuartions 中添加 Tomcat Server - Remote,进行简单的配置即可,它的功能差不多就是上面的 Deployment 和 Remote 的结合,如果需要 Debug 可以使用之前设置的 Remote 或者在 Tomcat Server 中的 Startup/Connection 的 Tab 内找到 Debug 设置端口

这里的 Tomcat 的 Deployment 会用到 Deployment 里面配置的服务器,因此 Deployment 不要再做配置了。选择的 Artifact 会作为本地上传路径,同时设置好 Application context,再在 Remote Staging 中设置上传的位置即可。因为程序是通过createStandardContext动态创建的,所以并不需要非要上传到 webapp 目录内。配置中涉及到两个路径,Path From Root 是上传路径,Mapped As 其实就是指定 docBase,必须是绝对路径。所以一般情况下Mapped As = Deployment Root Path + Path From Root。为啥两个配置要分开是因为你上传的服务器和你实际跑程序的服务器并不是一台,也许是通过网络挂载到应用服务器上的。网上好多对 Mapped As 的配置都是错误的,之所以能够运行是因为他们上传的路径是 webapp。

02.png

03.png

04.png

参考

Run/Debug Configuration: Tomcat Server

JMX 学习笔记

你了解 JMX 在 Tomcat 的应用吗?