Maven Plugin構(gòu)建模板方案

1.常見(jiàn)的maven Plugin:

編譯:

maven-compiler-plugin:編繹階段指定jdk版本斑胜。

資源/文件等拷貝:

maven-resources-plugin:拷貝配置等資源文件
maven-dependency-plugin:拷貝代碼所需的jar包,放到classes的lib下

測(cè)試階段:

maven-surefire-plugin:用于測(cè)試階段的插件
maven-failsafe-plugin:用作集成測(cè)試的配置倒庵。

打包:

maven-jar-plugin:只會(huì)把項(xiàng)目的java文件打包成一個(gè)jar,比較小檀蹋,沒(méi)有把依賴的lib一起打包進(jìn)去绿饵。
spring-boot-maven-plugin:在maven-jar-plugin的基礎(chǔ)上會(huì)生成一個(gè)用與啟動(dòng)的文件娃闲,并且把依賴的lib一起打包進(jìn)去項(xiàng)目的jar,這樣支持java -jar直接啟動(dòng)围来。

打包增強(qiáng)/定制:

maven-assembly-plugin: 這個(gè)插件能在上面打包插件的基礎(chǔ)上跺涤,更加定制化打包匈睁,比如單獨(dú)放某些文件到classes里面,或者將classes里面的配置放到j(luò)ar包同層之類的桶错。這樣能更加靈活的支持不同場(chǎng)景航唆。
maven-shade-plugin:不用它,這個(gè)功能沒(méi)maven-assembly-plugin全面牛曹,使用maven-assembly-plugin即可佛点。

部署:

maven-deploy-plugin: 一般用于將項(xiàng)目發(fā)布到遠(yuǎn)程倉(cāng)庫(kù)

其他:

maven-checkstyle-plugin:可以幫助開發(fā)檢測(cè)代碼中不合規(guī)范的地方。
jacoco-maven-plugin:生成單元測(cè)試覆蓋率報(bào)告黎比。
sonar-maven-plugin:使用該插件執(zhí)行sonar掃描超营。

2.不同場(chǎng)景構(gòu)建模板

1.只需考慮一個(gè)jar包運(yùn)行即可

1.使用maven-compiler-pluginmaven-jar-plugin能構(gòu)建出一個(gè)項(xiàng)目的jar,但是里面沒(méi)有項(xiàng)目依賴的jar包阅虫。所以這種適用于在服務(wù)器上已經(jīng)有依賴的jar包了演闭,只是改動(dòng)一下項(xiàng)目的代碼。

如果要把lib打包進(jìn)去需要再使用maven-dependency-plugin颓帝,把依賴的jar打包到lib里面米碰。

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
            </configuration>
        </execution>
    executions>
</plugin>

但是這種方式打包,如果任何代碼里面的配置文件修改了购城,都需要打包吕座,因?yàn)榕渲梦募呀?jīng)打包到j(luò)ar包里面的class目錄了,沒(méi)法直接修改瘪板。

2.使用maven-compiler-pluginspring-boot-maven-plugin也能構(gòu)建出一個(gè)項(xiàng)目的jar吴趴,這種和上面方案的區(qū)別就是會(huì)把依賴的jar一并打入到項(xiàng)目的jar里面,直接java -jar即可運(yùn)行侮攀,不依賴環(huán)境

模板:

<build>
        <finalName>xxx-xxx-activity-core</finalName>
   
        <resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>${file_encoding}</encoding>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <compilerArgument>-parameters</compilerArgument>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.2.2.RELEASE</version>
                <configuration>
                    <mainClass>com.xx.activity.core.ActivityApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

分析:
1.maven-resources-plugin 通過(guò)<resources>的配置來(lái)拷貝資源文件锣枝,默認(rèn)是src/main/resource
2.maven-compiler-plugin 編譯代碼變成.class文件兰英。
3.spring-boot-maven-plugin 將文件的所有依賴的jar都打包一個(gè)jar文件里面撇叁,并且可以指定啟動(dòng)類,這樣這個(gè)jar直接通過(guò) java -jar xxxx.jar即可啟動(dòng)畦贸。

2.jar包和配置文件分離

2.1 掛載方式

現(xiàn)在很多服務(wù)都是用k8s了陨闹,很多配置項(xiàng)是會(huì)單獨(dú)掛載出來(lái)方便修改的,比如項(xiàng)目里面的application.properties薄坏、log4j.xml等文件正林。如果還是按照之前的方式配置文件是會(huì)一并打包到項(xiàng)目的jar里面的,這種情況我們就沒(méi)法繞開每次改配置都要打包的情況颤殴。所以就需要把配置分離開到不同的目錄觅廓,支持靈活的再不重新打包項(xiàng)目的情況下修改配置文件。

2.2 springboot讀取配置文件

如果是spring-boot的jar的話涵但,它支持讀jar包外面的文件杈绸,同時(shí)讀取配置文件會(huì)有一定的順序帖蔓。

Spring boot 配置文件優(yōu)先級(jí):

 1.打包后的 Jar 包以外的 application-.properties;
 2.打包后的 Jar 包以外的 application.properties瞳脓;
 3.Jar 包內(nèi)部的 application-.properties塑娇;
 4.Jar 包內(nèi)部的 application.properties。

Jar 包外部的文件比內(nèi)部的優(yōu)先級(jí)高劫侧,特定 Profile 的文件比公共的文件優(yōu)先級(jí)高

指定 profile + 讀取外部配置文件:

1.當(dāng)前目錄的 /config 子目錄埋酬;
2.當(dāng)前目錄;
3.CLASSPATH 中的 /config 目錄烧栋;
4.CLASSPATH 根目錄写妥。

也就是說(shuō),如果要讀取任何外部文件审姓,不需要額外加任何參數(shù)珍特,只需要在jar同級(jí)目錄下,新建一個(gè)config目錄魔吐,然后把配置文件放進(jìn)去即可扎筒,這樣spring boot讀取到后,會(huì)自動(dòng)將其中的內(nèi)容添加到 Spring 的 Environment 中酬姆。

2.3 maven-assembly-plugin作用

就可以使用maven-assembly-plugin來(lái)定義好配置文件目錄嗜桌,然后通過(guò)掛載來(lái)覆蓋配置文件纲酗,起到不用重新打包也可以修改配置的文件的功能匿值。

模板:

<build>
        <finalName>xxx-xxx-activity-core</finalName>
   
        <resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
            <resource>
                <directory>src/main/resources/profiles/${spring.profiles.active}/config</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>${file_encoding}</encoding>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <compilerArgument>-parameters</compilerArgument>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.2.2.RELEASE</version>
                <configuration>
                    <mainClass>com.xx.activity.core.ActivityApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptors>
                        <descriptor>src/main/assembly/assembly.xml</descriptor>
                    </descriptors>
                    <finalName>${project.artifactId}</finalName>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

assembly.xml文件:

<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>distribution</id>
<formats>
    <format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
    <fileSet>
        <directory>${project.build.directory}</directory>
        <outputDirectory></outputDirectory>
        <includes>
            <!-- 項(xiàng)目的jar包 -->
            <include>*.jar</include>
        </includes>
    </fileSet>
    <fileSet>
        <directory>${project.build.directory}/classes</directory>
        <outputDirectory>config</outputDirectory>
        <includes>
            <!-- 項(xiàng)目配置文件 -->
            <include>*.properties</include>
            <include>*.xml</include>
            <include>*.json</include>
        </includes>
    </fileSet>
</fileSets>
</assembly>

分析:
1.maven-resources-plugin 通過(guò)<resources>的配置來(lái)拷貝資源文件,默認(rèn)是src/main/resource媚狰。
2.maven-compiler-plugin 編譯代碼變成.class文件淫僻。
3.spring-boot-maven-plugin 將文件的所有依賴的jar都打包一個(gè)jar文件里面诱篷,并且可以指定啟動(dòng)類壶唤,這樣這個(gè)jar直接通過(guò) java -jar xxxx.jar即可啟動(dòng)雳灵。
4.maven-assembly-plugin 比如定義好配置文件目錄,然后通過(guò)掛載來(lái)覆蓋配置文件闸盔,起到不用重新打包也可以修改配置的文件的功能悯辙。
assembly.xml這個(gè)文件將 spring-boot-maven-plugin打包出來(lái)的jar拷貝到當(dāng)前目錄,重點(diǎn)是:將classes文件下的配置文件拷貝到config目錄迎吵,這個(gè)config是spring-boot會(huì)去加載配置文件的目錄躲撰,這樣就能掛載來(lái)覆蓋配置文件

工作目錄:

image.png

config目錄的文件:

image.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末击费,一起剝皮案震驚了整個(gè)濱河市拢蛋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蔫巩,老刑警劉巖谆棱,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件快压,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡垃瞧,警方通過(guò)查閱死者的電腦和手機(jī)蔫劣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)个从,“玉大人脉幢,你說(shuō)我怎么就攤上這事∴氯瘢” “怎么了嫌松?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)意推。 經(jīng)常有香客問(wèn)我豆瘫,道長(zhǎng),這世上最難降的妖魔是什么菊值? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任外驱,我火速辦了婚禮,結(jié)果婚禮上腻窒,老公的妹妹穿的比我還像新娘昵宇。我一直安慰自己,他們只是感情好儿子,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布瓦哎。 她就那樣靜靜地躺著,像睡著了一般柔逼。 火紅的嫁衣襯著肌膚如雪蒋譬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天愉适,我揣著相機(jī)與錄音犯助,去河邊找鬼。 笑死维咸,一個(gè)胖子當(dāng)著我的面吹牛剂买,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播癌蓖,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼瞬哼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了租副?” 一聲冷哼從身側(cè)響起坐慰,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎用僧,沒(méi)想到半個(gè)月后结胀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體两残,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年把跨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了人弓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡着逐,死狀恐怖崔赌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情耸别,我是刑警寧澤健芭,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站秀姐,受9級(jí)特大地震影響慈迈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜省有,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一痒留、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蠢沿,春花似錦伸头、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至野宜,卻和暖如春扫步,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匈子。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工河胎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人旬牲。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓仿粹,卻偏偏與公主長(zhǎng)得像搁吓,于是被迫代替她去往敵國(guó)和親原茅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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