Spring Boot + Maven項(xiàng)目多module打包的問(wèn)題 - 坑,建議看看

一個(gè)項(xiàng)目IntelliJ IDEA的spring boot項(xiàng)目含有多個(gè)module础爬,module存在依賴關(guān)系。比如項(xiàng)目root項(xiàng)目為parent吼鳞,有三個(gè)module:common看蚜,service以及api,其中service依賴common赔桌,api依賴service供炎。項(xiàng)目結(jié)構(gòu)如下圖:

└─parent
    ├─api
    ├─common
    └─service

依次配置各個(gè)層級(jí)的pom.xml文件,其中在父級(jí)項(xiàng)目parent的pom.xml中疾党,加入maven構(gòu)建插件:spring-boot-maven-plugin

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

在parent的根目錄下音诫,利用以下命令進(jìn)行打包,遺憾的是總提示錯(cuò)誤:“package common does not exist”雪位。

mvn clean package

原先以為可能compile存在問(wèn)題竭钝,利用以下命令執(zhí)行后,并未發(fā)現(xiàn)編譯錯(cuò)誤雹洗。

mvn clean compile

是否存在引入包沖突的問(wèn)題呢香罐?利用maven的-X參數(shù)執(zhí)行以下命令,并仔細(xì)查看了輸出信息时肿,并未發(fā)現(xiàn)任何有關(guān)包沖突的錯(cuò)誤庇茫。

mvn clean package -X

是否各個(gè)pom.xml文件配置不正確?查閱了相關(guān)文檔螃成,核對(duì)了N遍旦签,確信parent及各個(gè)module的pom.xml是配置無(wú)誤的查坪。

所有問(wèn)題的原因究竟在哪里?那刻自己也是沒(méi)了頭緒宁炫,能想到的原因都已一一排查偿曙。一邊不斷重試(有點(diǎn)盲目),一邊在網(wǎng)上搜索是否有類似問(wèn)題的解決方案淋淀。令自己沮喪的是遥昧,找了很久并沒(méi)有發(fā)現(xiàn)有人碰到完全一樣的問(wèn)題。

后面的心情可想而知朵纷,有種無(wú)力感炭臭,充滿了挫折感,甚至開(kāi)始懷疑人生……

然而作為技術(shù)人袍辞,天生有種執(zhí)著鞋仍,不解決問(wèn)題誓不罷休。所以帶著的內(nèi)心的挫敗感繼續(xù)想辦法解決這個(gè)問(wèn)題搅吁。

在“山重水復(fù)疑無(wú)路”以及“踏破鐵鞋無(wú)覓處”時(shí)威创,幸運(yùn)之神關(guān)顧了我,讓自己找了一些線索:有人說(shuō)是maven默認(rèn)的打包方式引起的谎懦,有個(gè)選項(xiàng)需要進(jìn)行正確設(shè)置:classifier肚豺,這個(gè)選項(xiàng)主要有兩個(gè)用途:標(biāo)識(shí)引入包的版本(包括可以用于指定jdk的版本)以及同時(shí)輸出不同的構(gòu)件(artifactid)。

由于主要關(guān)注打包的問(wèn)題界拦,所以找到了官方的文檔:Spring Boot Maven Plugin吸申,其中有段文字:

By default, the repackage goal will replace the original artifact with the repackaged one. That's a sane behavior for modules that represent an app but if your module is used as a dependency of another module, you need to provide a classifier for the repackaged one.
If you are using spring-boot-starter-parent, the repackage goal is executed automatically in an execution with id repackage. In that setup, only the configuration should be specified as shown in the following example:

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>repackage</id>
            <configuration>
              <classifier>exec</classifier>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

This configuration will generate two artifacts: the original one and the repackaged counter part produced by the repackage goal. Both will be installed/deployed transparently.

根據(jù)文檔所述,如果一個(gè)module被另一個(gè)module所依賴享甸,那么需要顯示設(shè)置一個(gè)classifier截碴。對(duì)于spring-boot項(xiàng)目,可以設(shè)置:<classifier>exec</classifier>蛉威,在打包時(shí)會(huì)生產(chǎn)兩個(gè)構(gòu)件日丹,這兩個(gè)構(gòu)件都可以安裝或部署。根據(jù)這個(gè)guide蚯嫌,立馬在parent的pom.xml中增加了這個(gè)配置哲虾,如下圖:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <classifier>exec</classifier>
            </configuration>
        </plugin>
    </plugins>
</build>

運(yùn)行命令:

mvn clean package

完美打包成功。查看包的輸出目錄择示,果真有兩個(gè)相似名稱的包束凑,一個(gè)是[name]-[version].jar,另一個(gè)是[name]-[version]-exec.jar对妄。解壓對(duì)比了這兩個(gè)jar,發(fā)現(xiàn)名稱含有-exec為可運(yùn)行包敢朱,而另一個(gè)為普通包(不可通過(guò) java -jar運(yùn)行)剪菱。

自己將classifier配置刪除摩瞎,打包c(diǎn)ommon,查看輸出的jar孝常,發(fā)現(xiàn)是個(gè)可運(yùn)行的包旗们,其它的module無(wú)法依賴可運(yùn)行包。原來(lái)真正的原因在這里构灸!

折磨近一天的問(wèn)題終于解決上渴,潦草記錄該問(wèn)題,可能對(duì)有些人有些幫助喜颁。如果你有任何疑問(wèn)也可以私信來(lái)探討稠氮。

如果你不知道如何利用IntelliJ IDEA創(chuàng)建multi-module的項(xiàng)目,可以參考這篇文章Creating a Multi Module Project

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末半开,一起剝皮案震驚了整個(gè)濱河市隔披,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寂拆,老刑警劉巖奢米,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異纠永,居然都是意外死亡鬓长,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門尝江,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)涉波,“玉大人,你說(shuō)我怎么就攤上這事茂装〉□澹” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵少态,是天一觀的道長(zhǎng)城侧。 經(jīng)常有香客問(wèn)我,道長(zhǎng)彼妻,這世上最難降的妖魔是什么嫌佑? 我笑而不...
    開(kāi)封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮侨歉,結(jié)果婚禮上屋摇,老公的妹妹穿的比我還像新娘。我一直安慰自己幽邓,他們只是感情好炮温,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著牵舵,像睡著了一般柒啤。 火紅的嫁衣襯著肌膚如雪倦挂。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天担巩,我揣著相機(jī)與錄音方援,去河邊找鬼。 笑死涛癌,一個(gè)胖子當(dāng)著我的面吹牛犯戏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拳话,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼先匪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了假颇?” 一聲冷哼從身側(cè)響起胚鸯,我...
    開(kāi)封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎笨鸡,沒(méi)想到半個(gè)月后姜钳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡形耗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年哥桥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片激涤。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拟糕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出倦踢,到底是詐尸還是另有隱情送滞,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布辱挥,位于F島的核電站犁嗅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏晤碘。R本人自食惡果不足惜褂微,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望园爷。 院中可真熱鬧宠蚂,春花似錦、人聲如沸童社。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至呀癣,卻和暖如春旅东,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背十艾。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腾节,地道東北人忘嫉。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像案腺,于是被迫代替她去往敵國(guó)和親庆冕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

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