开发环境centos7+idea2016.3+tomcat8.5+jdk8
实现效果:
在idea中点击run时,自动将代码编译并上传、部署到远程服务器中。点击debug时,进行本地调试。
和传统的在本地服务器相比较的优势:
1、节省开发者开发机的资源,省去了本地服务器的CPU、内存的占用。
2、如果开发的程序为Android+J2EE或者IOS+J2EE等需要将服务器IP写入客户端,不需要客户端连接到同一局域网。
远程服务器操作:
修改tomcat的JMX[Java Management Extensions,Java管理扩展]参数。关于JMX的介绍可以参考。。。百度。
1、修改环境变量,添加Tomcat启动参数
添加Tomcat启动参数的方法有多种,我这里用的是将启动参数添加到环境变量,这种方法会在重启服务器后丢失启动参数,从而避免安全性问题,也可以直接将参数写入到catalina.sh中
CATALINA_OPTS="-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=1.2.3.4"
export CATALINA_OPTS
2、清空webapps目录
rm -rf ./webapps/*
3、清空work/Catalina/localhost/目录
rm -rf ./work/Catalina/localhost/*
4、启动Tomcat
./bin/catalina.sh run &
开发机操作:
1、创建J2EE项目,我这里使用了maven创建了一个Hello World,如图
2、添加运行配置
3、运行项目
4、运行效果
注:1.2.3.4为我这里使用的远程服务器IP,实际使用时需要修改为自己的真实远程服务器IP
参考资料:
http://blog.lanyus.com/archives/197.html
注意事项:
问题
点击debug的时候也出现了ubable to connect to ip:1099
分析
问题状态:
1、通过netstat查看端口号,显示1100为LISTEN;监听是正常的;
2、iptables中已经将端口号1100置为开放的;
3、远程通过telnet <ip> <port>时,telnet是正常的;
4、(但是)通过jconsole <ip> <port>进行连接时,连接不上;
5、(如果)关闭firewall的话,第4步的方式是可以成功的;
解答
In addition to listening to the port you specified (1100) the JMX server also listens to a randomly chosen (ephemeral) port.
Check, e.g. with lsof -i|grep java if you are on linux/osx, which ports the java process listens to and make sure your firewall is open for the ephemeral port as well.
除了JMX server指定的监听端口号外,JMXserver还会监听一到两个随机端口号
解决办法一:关闭防火墙(不考虑安全性,推荐)
解决办法二、可以通过命令:lsof -i|grep java |grep <pid> 来查看当前java进程需要监听的随机端口号,
# netstat -tupln |grep 1101
tcp 0 0 0.0.0.0:1101 0.0.0.0:* LISTEN 13997/java
# lsof -i|grep 13997
java 13997 root 9u IPv4 132890 0t0 TCP *:37040 (LISTEN)
java 13997 root 70u IPv4 132891 0t0 TCP *:pt2-discover (LISTEN)
java 13997 root 72u IPv4 132892 0t0 TCP *:40085 (LISTEN)
java 13997 root 76u IPv4 146976 0t0 TCP hotnamea:61618->10.88.146.205:49165 (ESTABLISHED)
java 13997 root 84u IPv4 132904 0t0 TCP *:61618 (LISTEN)
java 13997 root 95u IPv4 132936 0t0 TCP *:8163 (LISTEN)
把这些端口设置为开放状态。
问题二、
添加如下参数可以开启远程调试。
-agentlib:jdwp=transport=dt_socket,address=49739,suspend=n,server=y