使用IDEA单步调试LeanCloud云引擎服务(Java)

最近在使用LeanCloud的云引擎服务,我使用了Java版SDK,在IDEA中进行项目开发(实际上写的是Kotlin语言)。LeanCloud云引擎提供了一个lean.exe的命令行工具,使用lean up命令可以启动一个http服务,非常方便本地测试。代码修改后使用IDEA重新编译一下即可热更新,不用重新执行命令。

如果业务复杂一些,可能需要加点日志来调查。但如果想跟进一步直接用IDEA单步调试,找遍了它们文档和社区都没有方法,也没有其他的网友分享过,所以今天研究了一下。

因为LeanCloud的Java版运行的是一个Jetty服务,我先尝试不用lean命令行,自己在IDEA中配置了Jetty来运行。结果是能显示Web页,但真正想要调试的API接口都返回404。

研究了一下lean.exe的工作方式,发现它执行lean up后,该进程自己启动了3001端口,提供了一个快速调用API的web页。真正的云业务页面和API服务是它调用mvn jetty:run来运行的,默认是3000端口。而maven是用的开发者自己配置的路径,实际上执行的mvn.cmd jetty:run启用了一串如下java命令:

1
"D:\Program Files\Java\jdk1.8.0_92\bin\java.exe" -classpath "d:\work\maven\bin\..\boot\plexus-classworlds-2.5.2.jar" "-Dclassworlds.conf=d:\work\maven\bin\..\bin\m2.conf" "-Dmaven.home=d:\work\maven\bin\.." "-Dmaven.multiModuleProjectDirectory=D:\svnwork\playground\loanassistant-cloud" org.codehaus.plexus.classworlds.launcher.Launcher jetty:run

分析到这里就有办法了:java是可以通过参数开启远程调试的,只要把java的调试参数配置在mvn.cmd中,应该就可以调试真正的业务接口了

打开mvn.cmd文件,其中这行是真正的执行语句

1
%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %CLASSWORLDS_JAR% "-Dclassworlds.conf=%M2_HOME%\bin\m2.conf" "-Dmaven.home=%M2_HOME%" "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %CLASSWORLDS_LAUNCHER% %MAVEN_CMD_LINE_ARGS%

在其上增加一条java调试参数-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005然后加入命令行中

1
2
3
set EXT_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"

%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %CLASSWORLDS_JAR% "-Dclassworlds.conf=%M2_HOME%\bin\m2.conf" "-Dmaven.home=%M2_HOME%" "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %EXT_OPTS% %CLASSWORLDS_LAUNCHER% %MAVEN_CMD_LINE_ARGS%

大功告成

这时候运行lean up发现多了一行提示,表示已经打开了5005端口用于调试java

接下来在IDEA中增加Run Remote的配置,其默认的参数即是5005端口

运行刚才的配置

在想要调试的函数中加个断点,通过http://localhost:3001页面测试调用

断点成功,舒服了!