Maven插件調(diào)試方法

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栈雳,最終弄完护奈,我這邊樣子是這樣的:

下邊是步驟:直接像下面這樣生成一個,然后next結(jié)束:

為了方便演示哥纫,我們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ā)布杠河!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碌尔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子券敌,更是在濱河造成了極大的恐慌唾戚,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件待诅,死亡現(xiàn)場離奇詭異叹坦,居然都是意外死亡,警方通過查閱死者的電腦和手機卑雁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門立由,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人序厉,你說我怎么就攤上這事”瞎浚” “怎么了弛房?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長而柑。 經(jīng)常有香客問我文捶,道長荷逞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任粹排,我火速辦了婚禮种远,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘顽耳。我一直安慰自己坠敷,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布射富。 她就那樣靜靜地躺著膝迎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胰耗。 梳的紋絲不亂的頭發(fā)上限次,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音柴灯,去河邊找鬼卖漫。 笑死,一個胖子當(dāng)著我的面吹牛赠群,可吹牛的內(nèi)容都是我干的羊始。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼乎串,長吁一口氣:“原來是場噩夢啊……” “哼店枣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起叹誉,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤鸯两,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后长豁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钧唐,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年匠襟,在試婚紗的時候發(fā)現(xiàn)自己被綠了钝侠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡酸舍,死狀恐怖帅韧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情啃勉,我是刑警寧澤忽舟,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響叮阅,放射性物質(zhì)發(fā)生泄漏刁品。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一浩姥、第九天 我趴在偏房一處隱蔽的房頂上張望挑随。 院中可真熱鬧,春花似錦勒叠、人聲如沸兜挨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽暑劝。三九已至,卻和暖如春颗搂,著一層夾襖步出監(jiān)牢的瞬間担猛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工丢氢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留傅联,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓疚察,卻偏偏與公主長得像蒸走,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子貌嫡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 一比驻、maven插件的開發(fā): 1、首先隨便創(chuàng)建一個maven工程岛抄。 2别惦、然后在pom.xml文件中添加依賴: 這時還...
    飛翔的豬寶寶閱讀 7,625評論 1 1
  • 1 什么是插樁? 聽到關(guān)于“插樁”的詞語夫椭,第一眼覺得會很高深掸掸,那到底什么是插樁呢?用通俗的話來講蹭秋,插樁就是將一段代...
    楓葉1234閱讀 2,687評論 1 7
  • 經(jīng)過Maven生命周期的學(xué)習(xí)扰付,我們知道在Maven core中僅僅定義了抽象的生命周期,具體的實現(xiàn)是由插件完成的仁讨,...
    SonyaBaby閱讀 1,267評論 0 3
  • 所有項目的構(gòu)建都是有生命周期的羽莺,這個生命周期包括:項目清理、初始化洞豁、編譯禽翼、測試屠橄、打包、集成測試闰挡、驗證、部署礁哄、站點生...
    zlcook閱讀 2,769評論 0 21
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險厭惡者长酗,不喜歡去冒險,但是人生放棄了冒險桐绒,也就放棄了無數(shù)的可能夺脾。 ...
    yichen大刀閱讀 6,046評論 0 4