前言
以IntelliJ IDEA為例,通常我們調試maven項目時,都是直接點擊調試按鈕即可。但maven編寫的插件就不同了,由於插件需要打包成Jar加載到項目中,所以如果我們需要在編寫插件源碼時調試的話,就不能直接點擊調試按鈕了(因為沒有Main類),那么該怎么辦呢?
解決方案一(直接在插件項目中調試)
假設及正在編寫的maven插件擁有如下坐標:
<groupId>myPluginGroupId</groupId> <artifactId>myPluginArtifactId</artifactId> <version>myPluginVersion</version>
再假設你想將這個插件用在某個項目中,而項目中的pom.xml是這樣定義這個插件的:
<plugin> <groupId>myPluginGroupId</groupId> <artifactId>myPluginArtifactId</artifactId> <version>myPluginVersion</version> <executions> <execution> <id>myPluginGoal</id> <phase>compile</phase> <goals> <goal>myPluginGoal</goal> </goals> </execution> </executions> </plugin>
其中,myPluginGoal 即為你要調試的目標。
那么可以在Terminal中輸入命令:
mvnDebug myPluginGroupId:myPluginArtifactId:myPluginVersion:myPluginGoal
然后,程序會自動分配8000 Listen端口。此時,在myPluginGoal對應的程序中打上斷點,再點擊調試按鈕,就可以調試啦!
解決方案二(目標項目和插件項目聯調)
這樣的調試方式其實是服務器客戶端的方式,目標項目是服務器,插件項目是客戶端;只不過服務器和客戶端都在我們本地電腦上。
首先在在目標項目中,增加Maven運行配置
進入配置后,先進入Parameters中,配置Command line:
myPluginGroupId:myPluginArtifactId:myPluginVersion:myPluginGoal -DgroupId=myPluginGroupId -DartifactId=myPluginArtifactId -Dversion=myPluginVersion
注:如果插件已經在目標項目的 pom 中定義,可以只寫myPluginGroupId:myPluginArtifactId:myPluginVersion:myPluginGoal,后面的 -DgroupId 等參數可以不寫。
其中 -D 是 maven 命令,可以在終端輸入 mvn -h 查看其作用:設置屬性。類似例子可參見 https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html
再進入Runner, 不勾選“Use project settings”,配置VM Options:
其中的端口號可以改成其他的。
然后配置maven插件項目
增加Remote配置,並將其中的端口號改成和目標項目端口號相同的值即可。
現在可以開始調試啦
首先點擊目標項目的運行按鈕,啟動Listening...,再到插件項目中打好斷點、點擊調試按鈕,即可開始調試。
后記
調試的方法有多種,本文中的方法比較簡單,如有特殊需求可查詢其他方法。
另外,插件可以自定義前綴,方便實用。具體定義方式可查看官方文檔,本文不再贅述。
參考資料
《Maven實戰》第17章介紹了編寫maven插件的方法