我一直在努力从IntelliJ内部调试Grails 2.5.0应用程序。具体来说,我发现很难配置应用程序
从IntelliJ(版本14.1.4)中启动(1)和(2)时。
这是toy Grails app我用来调查此问题,它有一个功能测试。调试工作的关键似乎是这些JVM分支设置BuildConfig.groovy。
grails.project.fork = [
// configure settings for compilation JVM, note that if you alter the Groovy version forked compilation is required
// compile: [maxMemory: 256, minMemory: 64, debug: false, maxPerm: 256, daemon:true],
// configure settings for the test-app JVM, uses the daemon by default
test : [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, daemon: true, jvmArgs: jvmArgs],
// configure settings for the run-app JVM
run : [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve: false, jvmArgs: jvmArgs],
// configure settings for the run-war JVM
war : [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve: false],
// configure settings for the Console UI JVM
console: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256]
]
// Include the line below to debug functional tests from IntelliJ. The tests should be launched in Debug mode from IntelliJ
//grails.project.fork = null
启用分叉后,可以通过从IntelliJ内部运行来调试应用程序,然后从IDE启动远程调试器以连接到端口5005上的应用程序.JVM分叉设置可确保应用程序始终在启用远程调试的情况下运行,所以一定要通过运行来启动应用程序,而不是调试它。
要调试功能测试,您需要包含this line
grails.project.fork = null
这样就分叉了(并且禁用了远程调试。然后你可以通过IntelliJ调试配置启动测试来调试功能测试。
根据是应用程序还是正在调试的功能测试,必须包含/注释掉这一行是相当繁琐的,所以我正在寻找一个更简单的解决方案。
有人可能会认为这可以通过
来避免if (Environment.current == Environment.TEST) {
grails.project.fork = null
}
但由于某些未知原因,这不起作用。
答案 0 :(得分:3)
I have the following settings in BuildConfig.groovy
:
grails.project.fork = [
// configure settings for the test-app JVM, uses the daemon by default
test: false, // see http://youtrack.jetbrains.com/issue/IDEA-115097
// configure settings for the run-app JVM
run: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve:false],
// configure settings for the run-war JVM
war: false,
// configure settings for the Console UI JVM
console: false
]
You will need to add 2 run configurations in intellij:
run-app --debug-fork
as command line.To debug you app, run the first configuration. The grails app will start and should print Listening for transport dt_socket at address: 5005
. Once you see this message, run the debug configuration...
Let me know if you need screenshots
答案 1 :(得分:0)
有good hack用于启动远程调试而不需要为#34;侦听传输dt_socket at address:5005"线。只需运行远程调试和运行应用程序
用几句话说:
BuildConfig.groovy
// jvmArgs make it so that we can run in forked mode without having to use the `--debug-fork` flag
// and also has suspend=n so that it will start up without forcing you to connect a remote debugger first
def jvmArgs = ['-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005']
grails.project.fork = [
test: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, daemon:true, jvmArgs: jvmArgs],
run: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve:false, jvmArgs: jvmArgs],
war: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve:false, jvmArgs: jvmArgs],
console: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, jvmArgs: jvmArgs]
]
在启动远程调试器之前监控端口
如果在intellij中创建一个新的远程调试目标并在其中运行它 在运行应用程序或测试的同时,它会因为调试而失败 港口尚未开放。如果你手动完成,你需要等待 记录消息说调试端口已打开。那就更多了 保姆,我们可以避免通过一个小的shell脚本欺骗。
这是一个使用nc(netcat)命令监视a的shell脚本 localhost端口,只有在端口可用时才会继续。 将它保存为路径中的wait_for_port.sh:
#!/usr/bin/env bash
PORT_NUMBER="$1"
function usage {
echo "usage: ${0##*/} "
echo "ex: ${0##*/} 5005"
}
if [ -z $PORT_NUMBER ]; then
usage
exit 1
fi
echo "waiting for port $PORT_NUMBER to open up"
while ! nc -z localhost $PORT_NUMBER; do sleep 0.1; done;
让它使用此脚本作为监视端口5005的“外部工具” 在尝试连接之前。
答案 2 :(得分:0)
要调试应用程序本身,从 Grails 3
开始,我们可以转到 grails-app/init
,然后右键单击 Application.groovy
类并单击 Debug 'Application'
。