利用assembly插件分環(huán)境打包配置文件

首先, 鄭重的吐槽下度娘, 能找到的資料, 都是說(shuō)針對(duì)打包tar.gz的, 找了好一會(huì)兒, 才找到針對(duì)war包.
開(kāi)始并不順利, 因?yàn)樵诟缸幽K的場(chǎng)景下, 有war,有jar. 最后發(fā)現(xiàn)打包的lib里包含war包. 這樣不是重復(fù)打包嗎, 而且, 并不能打成標(biāo)準(zhǔn)war包結(jié)構(gòu).

好啦, 現(xiàn)在上正解.

工程結(jié)構(gòu):

parent          //pom
    | common   //jar
    | dao      //jar
    | web      //war

針對(duì)中這種結(jié)構(gòu)的工程, 網(wǎng)上的tar.gz的做法并不適用. 主要是: 1)會(huì)將web模塊的war包打進(jìn)lib文件中; 2)目錄結(jié)構(gòu)不是war包應(yīng)有的結(jié)構(gòu). 前者是因?yàn)閙aven自帶的編譯打包工具會(huì)先執(zhí)行打包操作, 這樣輪到assembly打包時(shí)會(huì)將打好的war包打進(jìn)lib文件夾中.

針對(duì)上文的工程結(jié)構(gòu), 需要:

  1. parentpom中統(tǒng)一配置自帶的編譯插件. 主要是指定編譯的jdk版本.(否則默認(rèn)會(huì)使用1.5的. 不會(huì)的需要補(bǔ)充學(xué)習(xí)下).
  2. jar模塊如果需要分環(huán)境打包配置文件, 則不需要任何多余的配置, 使用的默認(rèn)的jar打包即可.
  3. web模塊是重點(diǎn). 下文的配置都是針對(duì)web的配置. 通常web工程更多的需要分環(huán)境打包配置文件.

web配置文件結(jié)構(gòu)

1527171764196.png

我這里的思路是: resources下可以放置每個(gè)環(huán)境都需要的公共配置文件. 分環(huán)境的放在./src/main/assembly/下.

1 web模塊的pom.xml中的profiles配置

<profiles>
        <!--profile1: 開(kāi)發(fā)環(huán)境 dev-->
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
                <property>
                    <name>env</name>
                    <value>dev</value>
                </property>
            </activation>

            <!--定制鍵值對(duì)環(huán)境變量
            !重要: 這里才是將env=dev的變量傳入下面的assembly.xml中, 用于給${env}賦值, 上面的
<property>下面的那name,value并沒(méi)有什么亂用, 我也不知道別人為什么用這個(gè)!-->
            <properties>
                <env>dev</env>
            </properties>

            <build>
                <plugins>
                    <plugin>
                        <artifactId>maven-assembly-plugin</artifactId>
                        <configuration>
                            <!-- maven assembly插件需要一個(gè)描述文件 來(lái)告訴插件包的結(jié)構(gòu)以及打包所需的文件來(lái)自哪里 -->
                            <descriptors>
                                <descriptor>${basedir}/src/main/assembly/assembly.xml</descriptor>
                            </descriptors>
                            <finalName>${project.artifactId}-${project.version}</finalName>
                            <outputDirectory>${project.build.directory}</outputDirectory>
                        </configuration>
                    </plugin>
                </plugins>
            </build>

        </profile>
        <!--profile2: 測(cè)試環(huán)境 test-->
        <profile>
            <id>test</id>
            <activation>
                <property>
                    <name>env</name>
                    <value>test</value>
                </property>
            </activation>

            <properties>
                <env>test</env>
            </properties>

            <build>
                <plugins>
                    <plugin>
                        <artifactId>maven-assembly-plugin</artifactId>
                        <configuration>
                            <!-- 發(fā)布模式使用的maven assembly插件描述文件 -->
                            <descriptors>
                                <descriptor>${basedir}/src/main/assembly/assembly.xml</descriptor>
                            </descriptors>
                            <!-- 如果一個(gè)應(yīng)用的包含多個(gè)deploy模塊,如果使用同樣的包名棺牧, 如果把它們復(fù)制的一個(gè)目錄中可能會(huì)失敗巫糙,所以包名加了 artifactId以示區(qū)分 -->
                            <finalName>${project.artifactId}-${project.version}</finalName>
                            <!-- scm 要求 release 模式打出的包放到頂級(jí)目錄下的target子目錄中 -->
                            <outputDirectory>${project.build.directory}</outputDirectory>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

    <!--prod環(huán)境略-->

2 web模塊的pom.xml中引入assembly插件

<build>
        <plugins>
            <!-- deploy模塊的packaging通常是jar,如果項(xiàng)目中沒(méi)有java 源代碼或資源文件颊乘,加上這一段配置使項(xiàng)目能通過(guò)構(gòu)建 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.5</version>
                <configuration>
                    <archive>
                        <addMavenDescriptor>true</addMavenDescriptor>
                    </archive>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <!-- 這是最新版本参淹,推薦使用這個(gè)版本 -->
                <version>2.2.1</version>
                <executions>
                    <execution>
                        <id>assemble</id>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <!--綁定package生命周期-->
                        <phase>package</phase>
                    </execution>
                </executions>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId> <!-- 設(shè)為 FALSE, 防止 WAR 包名加入 assembly.xml 中的 ID -->
                    <attach>false</attach>
                </configuration>
            </plugin>
        </plugins>
    </build>

3 配置定制assembly.xml

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
    <id>web</id>
    <formats>
        <format>war</format>
        <!--生成同結(jié)構(gòu)的目錄, 方便查看, 可選-->
        <format>dir</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <!--打war包的文件配置-->
    <fileSets>
        <fileSet>
            <directory>${project.build.outputDirectory}</directory>
            <outputDirectory>WEB-INF/classes</outputDirectory>
        </fileSet>
        <!--分環(huán)境打包配置文件-->
        <!-- ${env} 的值由 -P 的參數(shù)傳遞進(jìn)來(lái), 如:-Pdev, 那么, ${env} 的值就是 dev -->
        <fileSet>
            <directory>${project.basedir}/src/main/assembly/${env}</directory>
            <outputDirectory>WEB-INF/classes</outputDirectory>
        </fileSet>
        <!--公共配置文件-->
        <fileSet>
            <directory>${project.basedir}/src/main/resources</directory>
            <outputDirectory>WEB-INF/classes</outputDirectory>
        </fileSet>
        <!-- 將 webapp 下的文件輸出到 WAR 包 -->
        <fileSet>
            <directory>${project.basedir}/src/main/webapp</directory>
            <outputDirectory>/</outputDirectory>
        </fileSet>
    </fileSets>


    <dependencySets>
        <!-- 將項(xiàng)目依賴的JAR包輸出到 WEB-INF/lib -->
        <dependencySet>
            <outputDirectory>WEB-INF/lib</outputDirectory>
            <!--經(jīng)測(cè)試可以不需要-->
            <!--<excludes>-->
                <!--<exclude>*.war</exclude>-->
            <!--</excludes>-->
            <useProjectArtifact>false</useProjectArtifact>
        </dependencySet>
    </dependencySets>
</assembly>

這里采用的方案是, 不同環(huán)境公用同一個(gè)assembly.xml文件.

4 執(zhí)行打包的命令

各環(huán)境對(duì)應(yīng)的命令:

mvn clean package
mvn clean package -P dev
mvn clean package -P test
mvn clean package -P prod

后記

分環(huán)境打包的分支控制策略有兩種:

  1. 通過(guò)profile配置不同的環(huán)境下的配置, 然后打包的時(shí)候通過(guò)參數(shù)-P 環(huán)境id定位到對(duì)應(yīng)profile, 就會(huì)執(zhí)行該profile下的所有配置, 包括自定義的properties(這里的propertiesprofile外層的效果一樣). 本文采用的就是這個(gè)思路.
    這種方案的好處是, 可以方便的定義默認(rèn)打包環(huán)境.

  2. 不同環(huán)境的配置文件分別放在不同的路徑下, 打包配置中用${env}動(dòng)態(tài)執(zhí)行路徑, 然后打包時(shí)帶上參數(shù): -Denv=環(huán)境名稱, 即動(dòng)態(tài)手動(dòng)指定環(huán)境名, 定位到對(duì)應(yīng)路徑下的配置文件. 這種方案看似簡(jiǎn)單好實(shí)施, 但有個(gè)缺陷就是不方便執(zhí)行默認(rèn)打包環(huán)境.

最后, 再次重復(fù)一個(gè)坑點(diǎn):
下圖中兩種property效果完全不同的, 上面的我完全不知道有什么鳥用, 下面的才是關(guān)鍵.

properties
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市乏悄,隨后出現(xiàn)的幾起案子浙值,更是在濱河造成了極大的恐慌,老刑警劉巖檩小,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件开呐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)筐付,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門卵惦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人瓦戚,你說(shuō)我怎么就攤上這事沮尿。” “怎么了较解?”我有些...
    開(kāi)封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵畜疾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我印衔,道長(zhǎng)啡捶,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任奸焙,我火速辦了婚禮瞎暑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘忿偷。我一直安慰自己金顿,他們只是感情好臊泌,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布鲤桥。 她就那樣靜靜地躺著,像睡著了一般渠概。 火紅的嫁衣襯著肌膚如雪茶凳。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天播揪,我揣著相機(jī)與錄音贮喧,去河邊找鬼。 笑死猪狈,一個(gè)胖子當(dāng)著我的面吹牛箱沦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雇庙,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼谓形,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了疆前?” 一聲冷哼從身側(cè)響起寒跳,我...
    開(kāi)封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竹椒,沒(méi)想到半個(gè)月后童太,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年书释,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翘贮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡征冷,死狀恐怖择膝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情检激,我是刑警寧澤肴捉,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站叔收,受9級(jí)特大地震影響齿穗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饺律,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一窃页、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧复濒,春花似錦脖卖、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至砸泛,卻和暖如春十籍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唇礁。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工勾栗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盏筐。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓围俘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親琢融。 傳聞我的和親對(duì)象是個(gè)殘疾皇子界牡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,778評(píng)論 6 342
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)吏奸,斷路器欢揖,智...
    卡卡羅2017閱讀 134,638評(píng)論 18 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong閱讀 22,366評(píng)論 1 92
  • 本章聊一聊ServletContext 3.0規(guī)范中定義的注解以及在web應(yīng)用中使用的框架和庫(kù)的可插拔性的提升奋蔚。 ...
    Lucky_Micky閱讀 6,028評(píng)論 0 3
  • 海頓她混、莫扎特烈钞、貝多芬、舒伯特坤按、勃拉姆斯毯欣、約翰?施特勞斯……這些締造了輝煌的大音樂(lè)家都曾在維也納生活過(guò),在這座充滿靈...
    巴逗旅游閱讀 491評(píng)論 0 3