Maven build標簽
前言:
<build >設置,主要用於編譯設置
1.分類
在Maven的pom.xml文件中,存在如下兩種<build>:
(1)全局配置(project build)
針對整個項目的所有情況都有效
(2)配置(profile build)
針對不同的profile配置
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> ... <!-- "Project Build" contains elements of the BaseBuild set and the Build set--> <build>...</build> <profiles> <profile> <!-- "Profile Build" contains elements of the BaseBuild set only --> <build>...</build> </profile> </profiles> </project>
說明:
一種<build>被稱為Project Build,即是<project>的直接子元素。
另一種<build>被稱為Profile Build,即是<profile>的直接子元素。
Profile Build包含了基本的build元素,而Project Build還包含兩個特殊的元素,即各種<...Directory>和<extensions>。
2. 配置說明
1.基本元素
示例如下
<build> <defaultGoal>install</defaultGoal> <directory>${basedir}/target</directory> <finalName>${artifactId}-${version}</finalName>
<filters>
<filter>filters/filter1.properties</filter>
</filters>
...
</build>
1)defaultGoal
執行build任務時,如果沒有指定目標,將使用的默認值。
如上配置:在命令行中執行mvn,則相當於執行mvn install
2)directory
build目標文件的存放目錄,默認在${basedir}/target目錄
3)finalName
build目標文件的名稱,默認情況為${artifactId}-${version}
4)filter
定義*.properties文件,包含一個properties列表,該列表會應用到支持filter的resources中。
也就是說,定義在filter的文件中的name=value鍵值對,會在build時代替${name}值應用到resources中。
maven的默認filter文件夾為${basedir}/src/main/filters
2. Resources配置
用於包含或者排除某些資源文件
<build> ... <resources> <resource> <targetPath>META-INF/plexus</targetPath> <filtering>true</filtering> <directory>${basedir}/src/main/plexus</directory> <includes> <include>configuration.xml</include> </includes> <excludes> <exclude>**/*.properties</exclude> </excludes> </resource> </resources> <testResources> ... </testResources> ... </build>
1)resources
一個resources元素的列表。每一個都描述與項目關聯的文件是什么和在哪里
2)targetPath
指定build后的resource存放的文件夾,默認是basedir。
通常被打包在jar中的resources的目標路徑是META-INF
3)filtering
true/false,表示為這個resource,filter是否激活
4)directory
定義resource文件所在的文件夾,默認為${basedir}/src/main/resources
5)includes
指定哪些文件將被匹配,以*作為通配符
6)excludes
指定哪些文件將被忽略
7)testResources
定義和resource類似,只不過在test時使用
Maven多環境配置實戰 filter
目前在開發一個wap項目,主要有開發、測試和最終部署上線幾個階段,每個階段對配置(數據庫、日志)都有不同的設置。以前都是以開發環境為主,在測試和部署上線時由部署工程師負責修改配置並上線。但是公司並非都有一個項目,我們也不是只負責一個項目,這樣的工作方式導致每每上線時大家都心驚膽顫,實在忍受不了折磨,決定研究下maven下如何解決這個問題。找到方案后,不敢獨享,將結果向大家介紹下。思路:
幾個環境中主要的不同可以概括為數據庫配置和log日志路徑配置以及外部依賴的接口配置不一樣,但是我們這里簡單起見,假設只考慮數據庫配置。
這樣的話,如果能實現在生成不同的發布包時對資源進行不同的替換就可以達到目的了。經過研究maven,確定了最終方案。最終方案:
首先需要在pom文件中確定filter和要filter的資源,這是通過在build節點中添加filter和resource來實現的,示例如下:
<filters> <filter>src/main/filters/filter-${env}.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources>
上述配置表示要對src/main/resources下的資源進行過濾,因為該目錄下沒有二進制文件,所以沒有excluding。過濾時采用的過濾文件為src/main/filters/filter-${env}.properties文件,其中${env}是一個變量,表示當前使用的環境,這是通過在pom文件中通過profile定義的,如下所示:
<properties> <env>dev</env> </properties> <profiles> <profile> <id>dev</id> <properties> <env>dev</env> </properties> </profile> <profile> <id>test</id> <properties> <env>test</env> </properties> </profile> <profile> <id>product</id> <properties> <env>product</env> </properties> </profile> </profiles>
其中斜體字部分表示缺省的變量值,這樣在開發時就不用每次指定這個值。在測試和部署上線時分別通過-P傳入當前的profile id,這樣maven就會將env變量設置為對應的值,從而導致使用不同的filter文件來對resources下的文件進行過濾替換。
例如:當調用maven package時傳入-Pdev(因為我們將dev設置為默認,所以也可以不傳)參數,則會使用
filter-dev.properties中的內容來替換resources目錄中的配置文件,具體到我們的項目就是db.properties,內容如下:
....... jdbc.connection.url=${xiangmu.jdbc.url} jdbc.connection.username=${xiangmu.jdbc.username} jdbc.connection.password=${xiangmu.jdbc.password} ...............
filter-dev.properties文件內容如下:
................ xiangmu.jdbc.url=jdbc:mysql://localhost:3306/xiangmu?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8 xiangmu.jdbc.username=root xiangmu.jdbc.password=abcdefg .................
這樣在編譯結束后
db.properties的內容就會變為: jdbc.connection.url=jdbc:mysql://localhost:3306/xiangmu?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8 jdbc.connection.username=root jdbc.connection.password=abcdefg
3 plugins配置
用於指定使用的插件
<build> ... <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.0</version> <extensions>false</extensions> <inherited>true</inherited> <configuration> <classifier>test</classifier> </configuration> <dependencies>...</dependencies> <executions>...</executions> </plugin> </plugins> </build>
4 pluginManagement配置
pluginManagement的配置和plugins的配置是一樣的,只是用於繼承,使得可以在孩子pom中使用。
父pom:
<build> ... <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.2</version> <executions> <execution> <id>pre-process-classes</id> <phase>compile</phase> <goals> <goal>jar</goal> </goals> <configuration> <classifier>pre-process</classifier> </configuration> </execution> </executions> </plugin> </plugins> </pluginManagement> ... </build>
則在子pom中,我們只需要配置:
<build> ... <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> </plugin> </plugins> ... </build>
這樣大大簡化了孩子pom的配置