我在離開它幾年後再次與Grails合作。我正在使用IntelliJ 2016.01和Grails 3.1.4。它應該很容易,對吧?一切工作正常,但我無法從IntelliJ內啓動調試器,因爲我習慣於這樣做。在以前的生活中,我使用IJ10和Grails 1.0.5。Grails 3在IntelliJ中調試
通過各種搜索,我發現當Grails 2.3出於各種原因開始在分叉模式下運行時,發生了變化。不理解所有技術細節我的理解是,這是出於性能原因。無論如何,我能找到解決方法,但似乎還有很長的路要走。有誰知道更好的方法?我錯過了什麼?
我創建了一個Ant任務調用的Grails運行的應用程序:
<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>
如果你運行它自己的,你看到Grails這個任務運行在一個新的cmd窗口調試模式: |運行的應用程序... 地址監聽運輸dt_socket:5005
然後,我創建了一個「遠程」運行/調試中的IntelliJ配置爲在端口5005連接我有可用於此運行/調試配置調試按鈕所以我點擊調試。它很好。
首先,我看到這個的IntelliJ:
Connected to the target VM, address: 'localhost:5005', transport: 'socket'
然後過了一會兒cmd窗口被更新,以顯示該應用程式已在調試模式:
| Running application...
Listening for transport dt_socket at address: 5005
Grails application running at http://localhost:8080 in environment: development
在這一點上我可以在端口8080上導航應用程序沒有任何問題。我可以修改代碼的某些部分,如控制器,它會被編譯並立即可用。是啊。
我把它更進了一步,並添加停止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>
我不得不修改我的啓動調試Grails的任務等待的Grails開始偵聽端口5005
<!--delay to let the server start-->
<sleep seconds="20"/>
現在我可以在調試的IntelliJ我習慣通過點擊調試準備用遙控器通過的方式在IntelliJ中進行處理。有誰知道更好的方法來處理這個問題嗎?
哇。非常感謝你user3718614。這是行得通的。不知道我是如何錯過這一點,但很高興知道。謝謝!!現在我要刪除我的項目中的一些ant任務。 – bigMC28
你可以調試但如果你改變了代碼的某些部分,如控制器,它不會被編譯並立即可用 –
我得到java.lang.NoClassDefFoundError:groovy/lang/GroovyObject。 – sanya