maven項(xiàng)目依賴分開打包方法

背景
java的pringboot項(xiàng)目現(xiàn)在打包方式一般會(huì)包含項(xiàng)目的所有依賴,保證每個(gè)包都能獨(dú)立部署,但缺點(diǎn)也很明顯硬毕,就是依賴稍微多點(diǎn)礼仗,就會(huì)十分大元践,對(duì)于需要頻繁更新或者多個(gè)項(xiàng)目部署的情況下,就很浪費(fèi)時(shí)間和帶寬沪羔。
其實(shí)java jar包已經(jīng)為我們提供了外置配置文件蔫饰、依賴的方案愉豺,讓開發(fā)者可以靈活選擇部署方式蚪拦,這篇文章主要講講這方面的實(shí)踐。
相關(guān)知識(shí)
Lesson: Packaging Programs in JAR Files ((oracle.com)
Apache Maven JAR Plugin – Introduction

栗子
在項(xiàng)目pom文件build下加入如下配置

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <!-- 包含文件配置盛嘿,現(xiàn)在只打包 com 文件夾 -->
                    <includes>
                        <include>
                            **/com/**
                        </include>
                    </includes>

                    <archive>
                        <manifest>
                            <!-- 配置加入依賴包 -->
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <useUniqueVersions>false</useUniqueVersions>
                            <!-- Spring Boot 啟動(dòng)類(自行修改) -->
                            <mainClass>com.server.EnterpriseApp</mainClass>
                        </manifest>
                        <manifestEntries>
                            <!-- 外部資源路徑加入 manifest.mf 的 Class-Path -->
                            <Class-Path>resources/</Class-Path>
                        </manifestEntries>
                    </archive>
                    <!-- jar 輸出目錄 -->
                    <outputDirectory>${project.build.directory}/pack/</outputDirectory>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <!-- 復(fù)制依賴 -->
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <!-- 依賴包 輸出目錄 -->
                            <outputDirectory>${project.build.directory}/pack/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <!-- 復(fù)制資源 -->
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <resources>
                                <resource>
                                    <directory>src/main/resources</directory>
                                </resource>
                            </resources>
                            <!-- 資源文件 輸出目錄 -->
                            <outputDirectory>${project.build.directory}/pack/resources</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

第一個(gè)plugin类垦,第一個(gè)plugins就是打包我們實(shí)際的業(yè)務(wù)邏輯蚤认,不包含dependcies糕伐,其實(shí)configuration中其實(shí)就是配置目標(biāo)jar包的MANIFEST.MF文件,這個(gè)文件是我們?cè)趫?zhí)行java -jar a.jar時(shí)荣赶,java會(huì)去找這個(gè)文件來啟動(dòng)jar包,具體結(jié)構(gòu)見之上官方鏈接况增,這個(gè)插件會(huì)幫助我們把所有用到的依賴寫到文件的Class-Path :下训挡,如果目錄有要求可以通過<classpathPrefix>來指定哦澜薄。還有一塊需要注意的,就是<manifestEntries>下的<Class-Path>颊艳,這句話是單獨(dú)加入一項(xiàng)進(jìn)入Class-Path蟆沫,這個(gè)resources對(duì)應(yīng)的是我們之后單獨(dú)外置的java/resources目錄下的配置文件饭庞。
這樣,我們就能讓jar包找到需要的外置依賴绸狐。
第二塊plugin寒矿,第三個(gè)plugin這兩塊其實(shí)都是復(fù)制文件若债,復(fù)制依賴到對(duì)應(yīng)文件夾,然后復(fù)制resource
第二塊plugin 指定java版本啊终,不指定會(huì)報(bào)錯(cuò)傲须。

結(jié)論
這樣,我們打的分離包就只有100KB出頭泰讽,更新的時(shí)候就非常方便了昔期,而且多項(xiàng)目也可以共用相同的依賴硼一。但是新的問題依然很嚴(yán)重翎嫡,那就是更新依賴的時(shí)候非常不方便,需要手動(dòng)去判斷,不管是腳本檢測(cè)還是全量覆蓋圈驼,操作起來都有成本望几。
還有一種解決方案是可以部分全量橄抹,做一個(gè)公共的lib供所有項(xiàng)目調(diào)用,可以減少包體大小楼誓,用到的plugin是 maven-shade-plugin 疟羹,通過指定<excludes>來去除公共包,但是需要手動(dòng)命令行指定 通過java -classpath lib -jar a.jar來找到公共包参淫,有一定的部署前期成本愧杯,各有利弊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末耍铜,一起剝皮案震驚了整個(gè)濱河市业扒,隨后出現(xiàn)的幾起案子舒萎,更是在濱河造成了極大的恐慌,老刑警劉巖章鲤,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件败徊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡煤杀,警方通過查閱死者的電腦和手機(jī)沪哺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門枯途,熙熙樓的掌柜王于貴愁眉苦臉地迎上來籍滴,“玉大人,你說我怎么就攤上這事晚岭』艺埃” “怎么了酝润?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)构回。 經(jīng)常有香客問我纤掸,道長(zhǎng),這世上最難降的妖魔是什么借跪? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任掏愁,我火速辦了婚禮,結(jié)果婚禮上果港,老公的妹妹穿的比我還像新娘。我一直安慰自己谢谦,他們只是感情好回挽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布猩谊。 她就那樣靜靜地躺著预柒,像睡著了一般宜鸯。 火紅的嫁衣襯著肌膚如雪遮怜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天即碗,我揣著相機(jī)與錄音剥懒,去河邊找鬼合敦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛充岛,可吹牛的內(nèi)容都是我干的崔梗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼场躯,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了推盛?” 一聲冷哼從身側(cè)響起耘成,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤瘪菌,失蹤者是張志新(化名)和其女友劉穎嘹朗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屹培,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蓄诽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年仑氛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闸英。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡出吹,死狀恐怖沛豌,靈堂內(nèi)的尸體忽然破棺而出加派,到底是詐尸還是另有隱情,我是刑警寧澤竹勉,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布次乓,位于F島的核電站,受9級(jí)特大地震影響城看,放射性物質(zhì)發(fā)生泄漏测柠。R本人自食惡果不足惜轰胁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一朝扼、第九天 我趴在偏房一處隱蔽的房頂上張望擎颖。 院中可真熱鬧,春花似錦肖抱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拌屏。三九已至潮针,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間倚喂,已是汗流浹背每篷。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留端圈,地道東北人焦读。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像舱权,于是被迫代替她去往敵國(guó)和親矗晃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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