最近在使用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 | set EXT_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005" |
大功告成
这时候运行lean up
发现多了一行提示,表示已经打开了5005
端口用于调试java
接下来在IDEA中增加Run Remote的配置,其默认的参数即是5005
端口
运行刚才的配置
在想要调试的函数中加个断点,通过http://localhost:3001
页面测试调用
断点成功,舒服了!