Maven插件調(diào)試方法
[toc]
前言
今年的更新頻率簡直是降至冰點了许溅,一方面平時加班相對多一些了温鸽,下班只想玩手機保屯;另一方面,好像進了大廠后涤垫,學(xué)習(xí)動力也很低了姑尺,總之就,很懶散蝠猬,博客的話切蟋,今年都才只更新了不到5篇。
現(xiàn)在慢慢有一點狀態(tài)榆芦,開始學(xué)點技術(shù)柄粹;今天這篇就是講maven插件,為啥會折騰這個匆绣,公司內(nèi)有個mybatis generator驻右,針對公司內(nèi)部做了一些定制開發(fā),具體內(nèi)容不知道犬绒,但是旺入,有個很蛋疼的問題,在根據(jù)數(shù)據(jù)庫表凯力,反向生成po的時候茵瘾,不能把數(shù)據(jù)庫表的字段的注釋,給生成為po的field 注釋咐鹤。
之前試過自己折騰一下拗秘,解決這個問題,但是實在不了解maven插件這塊祈惶,因此一直就忍了將就用雕旨,大不了就沒有注釋嘛扮匠;前幾個月就把maven源碼下載下來了,但是源碼里一堆的單元測試凡涩,卻一直不知道怎么像我們平時使用的方式那樣去debug棒搜,最后就三天打魚兩天曬網(wǎng)地瞎看,效果很差活箕,看了多少就忘多少力麸,最近才把debug插件的方式折騰ok,這里就分享給大家育韩。
下邊正文克蚂。
越是復(fù)雜的開源項目,里面用到的maven插件就越多筋讨,一個pom埃叭,大幾百行是常事,經(jīng)常呢悉罕,大家都是只知道怎么配置赤屋,或者說,不知道怎么配置蛮粮,需要改配置的時候益缎,就一頓猛搜,經(jīng)常網(wǎng)上搜出來的然想,可能還因為版本不匹配發(fā)生“他文章里可以,我這邊為啥不行”欣范。
反正变泄,總結(jié)一句話,maven插件很多時候恼琼,對大家來說妨蛹,就是一個黑盒。
而我們恰恰不太能忍受黑盒晴竞,當(dāng)然了蛙卤,像什么jvm那種c++寫的黑盒就算了,讓人頭禿噩死。
另外颤难,可以再給大家一個看這篇文章的理由,就問你一個問題:spring boot是怎么打包成fat jar已维,又是怎么從一個fat jar啟動的行嗤?
是吧,這里的答案就在spring boot的maven插件里了垛耳。今天我們肯定不會那么復(fù)雜栅屏,搞個clean插件學(xué)習(xí)下飘千,就ok了。
怎么單行調(diào)試一個插件的源碼呢
創(chuàng)建演示工程
我們需要一個maven的project栈雳,最終弄完护奈,我這邊樣子是這樣的:
為了方便演示哥纫,我們pom.xml里逆济,刪除了<build>元素里的內(nèi)容(主要是被插件版本的管理,我們?yōu)榱搜菔净腔苯觿h了奖慌,用默認(rèn)版本就行),刪除后的pom如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>test-project</artifactId>
<version>1.0-SNAPSHOT</version>
<name>test-project</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
</build>
</project>
大家看上面這個pom松靡,很干凈简僧,會不會以為這樣就沒有配置插件了呢,不是的雕欺,默認(rèn)的岛马,就會給我們的maven的生命周期綁定一些插件,比如在clean階段綁定maven-clean-plugin插件屠列±材妫可以看我下圖,可以看到這里還是有好幾個插件的笛洛,為了力求簡單好理解夏志,我們關(guān)注clean插件,我這邊是2.5版本苛让,大家對于版本號不用糾結(jié)沟蔑,可能不同的idea版本出來的會有差異。
調(diào)試clean插件
怎么調(diào)試呢狱杰,首先得觸發(fā)maven的clean插件執(zhí)行瘦材,是吧?怎么觸發(fā)執(zhí)行呢仿畸?
如何觸發(fā)執(zhí)行clean插件
針對這種命令很簡單的食棕,不需要給插件傳參數(shù)的命令,直接上圖這樣就可以觸發(fā)調(diào)試運行错沽。
大家來看看執(zhí)行效果:
上面這一串簿晓,看起來很長,其實很多都是-D指定的SystemProperty和classpath甥捺,最終呢抢蚀,其實就是java -main類 -args的格式。
這里的參數(shù)就是"clean:clean"镰禾。
去哪里打斷點
有人開始問了皿曲,你不是說調(diào)試嗎唱逢,這都一把跑完了啊,再說了屋休,我想打斷點去哪里打呢坞古?
ok,要打斷點劫樟,我們得知道痪枫,mvn clean肯定會執(zhí)行到的那個方法,然后才能在那里提前打斷點埋伏叠艳,就好像我們總是知道奶陈,程序執(zhí)行,會進入main方法一樣附较。
而mvn clean吃粒,一定會執(zhí)行到clean插件中的CleanMojo這個class(這部分知識算是需要提前了解的部分):
要調(diào)試這個類,必須得在當(dāng)前的project(idea里拒课,一個project包含多個module)里徐勃,能找到這個class。在idea里早像,老子上來就是double shift僻肖,
看起來,找不到這個類啊卢鹦,還怎么玩臀脏?最簡單的辦法是,先直接把這個jar包加到project里面法挨,
添加到libraries里:
加的時候谁榜,會提示你,要不要加入到當(dāng)前這個project凡纳,要選:yes。加了后帝蒿,就可以看到:
老子抬手又是doubel shift荐糜,可以看到,這個cleanMojo已經(jīng)存在了葛超。
既然存在了暴氏,接下來就是打斷點:
繼續(xù)觸發(fā)執(zhí)行debug
可以看到,已經(jīng)成功停在了我們的斷點上绣张,接下來單步調(diào)試就行答渔。但是哈,大家也注意到侥涵,我們這邊因為是打在反編譯的class上的沼撕,而反編譯的class呢宋雏,肯定沒有源碼那么舒服的,這個問題呢敬鬓,也簡單驻售,等我循序漸進來講皮壁。
去哪里打斷點--方式2
我們下邊這個方式,當(dāng)然是想辦法在源碼上打斷點蚪燕,源碼去哪里獲取奔浅?
https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-clean-plugin/2.5
源碼下載下來后馆纳,我嘗試了下圖這樣的方式(就是在前面方案的基礎(chǔ)上,把源碼附上了):
這種方式汹桦,打個斷點鲁驶,看看:
這個方式是可以調(diào)試插件本身那幾個java文件,但是插件依賴的那些营勤,就還是有問題灵嫌,這種方式吧,雞肋葛作。
去哪里打斷點--最推薦的方式
我們還是不搞那些有的沒的了寿羞,來官方的插件開發(fā)地址拉代碼:
https://maven.apache.org/scm.html
下載后解壓,發(fā)現(xiàn)是個maven工程赂蠢,舒服了绪穆。直接導(dǎo)入idea。導(dǎo)入后虱岂,我們打好了斷點玖院,下邊開始,跑一波debug第岖。
可以看到难菌,這把舒服了,確確實實蔑滓,調(diào)試的是源代碼了郊酒。但是,這里提醒一下键袱,不要想著去改代碼燎窘,如果直接改,改了肯定就class和java源碼的行號蹄咖,對應(yīng)不上了褐健,至于為什么,這是一個值得大書特書的故事了澜汤,留待后續(xù)蚜迅。
擴展
前面我們說的舵匾,觸發(fā)maven clean執(zhí)行慢叨,是用的這種方式纽匙。
實際上烛缔,這種只能應(yīng)付簡單場景践瓷,不需要傳參什么的晕翠,復(fù)雜場景還是需要像下面這樣:
比如,我們公司的那個mybatis 生成器:
就會指定很多參數(shù)爸邢,比如對應(yīng)的配置文件的位置樊卓,對吧。
本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布杠河!