Debugging IntelliJ中的Grails3调试

Debugging IntelliJ中的Grails3调试,debugging,grails,intellij-idea,Debugging,Grails,Intellij Idea,在离开Grails几年后,我又开始使用它了。我正在使用IntelliJ 2016.01和Grails 3.1.4。这应该很容易,对吧?一切正常,只是我不能像往常一样从IntelliJ内部启动调试器。在以前的生活中,我将IJ10与grails1.0.5结合使用 通过各种搜索,我发现这种变化起源于Grails2.3,当时由于各种原因,Grails2.3开始以分叉模式运行。在不了解所有技术细节的情况下,我的理解是这样做是出于性能原因。不管怎样,我找到了一个解决办法,但似乎还有很长的路要走。有人知道更好

在离开Grails几年后,我又开始使用它了。我正在使用IntelliJ 2016.01和Grails 3.1.4。这应该很容易,对吧?一切正常,只是我不能像往常一样从IntelliJ内部启动调试器。在以前的生活中,我将IJ10与grails1.0.5结合使用

通过各种搜索,我发现这种变化起源于Grails2.3,当时由于各种原因,Grails2.3开始以分叉模式运行。在不了解所有技术细节的情况下,我的理解是这样做是出于性能原因。不管怎样,我找到了一个解决办法,但似乎还有很长的路要走。有人知道更好的方法吗?我错过了什么

我创建了一个ant任务来调用grails run app:

<target name="start-debug-grails">
    <exec executable="cmd">
        <arg value="/c"/>
        <arg value="start"/>
        <arg value="grails"/>
        <arg value="run-app"/>
        <arg value="--debug-jvm"/>
    </exec>
</target>
几分钟后,cmd窗口更新,显示应用程序处于调试模式:

| Running application...
Listening for transport dt_socket at address: 5005
Grails application running at http://localhost:8080 in environment: development
此时,我可以在端口8080上导航应用程序,没有问题。我可以对代码的某些部分进行更改,例如控制器,它将被编译并立即可用。嗯

我更进一步,添加了stop ant任务(比应该的要难一点),这样我就可以执行这两个任务(如果进程正在运行,则先停止),然后启动:

<target name="stop-debug-grails" depends="-stop-debug-init, -stop-debug-kill"/>

<target name="-stop-debug-init">
    <!--check if process is running-->

    <exec executable="jps">
        <arg value="-l"/>
        <redirector outputproperty="process.pid">
            <outputfilterchain>
                <linecontains>
                    <contains value="grails"/>
                </linecontains>
                <replacestring from=" org.grails.cli.GrailsCli"/>
            </outputfilterchain>
        </redirector>
    </exec>
    <echo>
        ${process.pid}
    </echo>
    <condition property="do.kill">
        <not>
            <!--checks to make sure pid is non blank before calling kill-process-->
            <equals arg1="${process.pid}" arg2="" />
        </not>
    </condition>
</target>

<target name="-stop-debug-kill" if="do.kill">
    <echo>
        killing process ${process.pid}
    </echo>
    <exec executable="taskkill" osfamily="winnt">
        <arg value="/F"/>
        <arg value="/PID"/>
        <arg value="${process.pid}"/>
    </exec>
    <exec executable="kill" osfamily="unix">
        <arg value="-9"/>
        <arg value="${process.pid}"/>
    </exec>
</target>

${process.pid}
正在终止进程${process.pid}
我必须编辑启动调试grails任务,以等待grails开始侦听端口5005

<!--delay to let the server start-->
<sleep seconds="20"/>


现在,我可以通过单击IntelliJ中远程进程的debug,以我习惯的方式在IntelliJ中进行调试。有人知道更好的处理方法吗?

在Grails3中调试非常简单。打开类
应用程序.groovy
并单击Debug.

对我有效的方法是使用Debug启动gradle任务启动


使用grails 3.2.3+intellij 2016.2.5重新加载断点和更改效果良好,以防万一,如果您使用@user3718614描述的非常简单的方法,并且您的Web应用程序运行良好,但忽略了断点,则在build.gradle中进行更改:


对于Grails 3.2.11来说,这很有帮助。

Wow。非常感谢你。这是有效的。我不知道我怎么会错过这个,但很高兴知道。谢谢现在,我要从我的项目中删除一些ant任务。您可以进行调试,但如果您对代码的某些部分(如控制器)进行更改,它将不会被编译并立即可用。我得到java.lang.NoClassDefFoundError:groovy/lang/GroovyObject。这在Grails 3.2.6中不适用。使用调试运行gradle bootRun不会
<!--delay to let the server start-->
<sleep seconds="20"/>
bootRun {
    jvmArgs = ['-Dspring.output.ansi.enabled=always']
}
bootRun {
    jvmArgs('-Dspring.output.ansi.enabled=always')
}