maven系列--pom.xml(build元素)
技術標籤:Maven/Gradle
resources
其他網址
Apache Maven Resources Plugin外掛詳解_成長的足跡-CSDN部落格
maven之<build> <resources> <resource> 詳細介紹_塗作權的部落格-CSDN部落格
Maven學習筆記(十二)-maven打包之resource配置_fendo-CSDN部落格_maven resources
Maven 資原始檔(Resources)的打包(package)與過濾(filter)_zsensei的部落格-CSDN部落格
簡介
maven預設的處理流程
- java:src/main/java和src/test/java
這兩個目錄中的所有*.java檔案會分別在comile和test-comiple階段被編譯,編譯結果分別放到了target/classes和targe/test-classes目錄中,但是這兩個目錄中的其他檔案都會被忽略掉。- resources:src/main/resouces和src/test/resources
這兩個目錄中的檔案也會分別被複制到target/classes和target/test-classes目錄中。- target:target/classes
打包外掛預設會把這個目錄中的所有內容打入到jar包或者war包中。
Apache Maven Resources Plugin
Apache Maven Resources Plugin是Apache Maven團隊提供的官方核心外掛,能夠將Maven專案中的各種資原始檔複製到指定的輸出目錄中。此外掛是預設就帶的,無需引入。
1. 在Maven專案中的資源可以分為兩類
- main資源,指位於src/main/resources路徑下的資原始檔
- test資源,指位於src/test/resources路徑下的資原始檔
2.Apache Maven Resources Plugin提供的Goals
1)resources:resources
將main資原始檔複製到輸出目錄,預設已經加入到Maven的process-resources
生命週期階段。
- <project><build><resources>指定要複製的main資原始檔,預設位於src/main/resources路徑
- <project><build><outputDirectory>指定main資源的輸出目錄,預設位於target/classes/路徑
2)resources:testResources
將test資原始檔複製到輸出目錄,預設已經加入到Maven的process-test-resources生命週期階段。
- <project><build><testResources>指定要複製的test資原始檔,預設位於src/test/resources路徑
- <project><build><testOutputDirectory>指定test資源的輸出目錄,預設位於target/test-classes/路徑
3)resources:copy-resources
對於非main資源或非test資源,又沒有在pom.xml的<build><resources>...</build></resources>配置的資源,在構建過程中不會輸出到專案的target/classes/目錄下。
<resource> <targetPath>META-INF/plexus</targetPath> <!--- <filtering>false</filtering> ---> <directory>${basedir}/src/main/plexus</directory> <includes> <include>configuration.xml</include> </includes> <excludes> <exclude>**/*.properties</exclude> </excludes> </resource>
targetPath:指定打包後放到哪個目錄,預設是base directory。
filtering:指定是否將filter檔案(即上面說的filters裡定義的*.property檔案)的變數值在這個resource檔案有效,例如上面就指定那些變數值在configuration檔案無效。
directory:指定屬性檔案的目錄,build的過程需要找到它,並且將其放到targetPath下,預設的directory是${basedir}/src/main/resources
includes:指定包含檔案的patterns,符合樣式並且在directory目錄下的檔案將會包含進project的資原始檔。
excludes:指定不包含在內的patterns。如果inclues與excludes有衝突,那麼excludes勝利,那些符合衝突的樣式的檔案是不會包含進來的。
filtering詳解
指定資原始檔
其他網址
簡介
如果我們的資源不在預設的路徑下邊,那麼就要手動去指定它。方法如下:
- 設定build/resources
- 使用maven-resources-plugin外掛
- 使用build-helper-maven-plugin外掛
示例1:既使用父專案(parent指定)的resources路徑,又使用本專案的resources路徑
在父專案的pom.xml裡新增此配置:
<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>../base/src/main/resources</directory> <includes> <include>**/*</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
示例2:不同方法打包src/main/java下邊的*.xml檔案
Mybatis的xxx.xml檔案,我們習慣把它和Mapper.java放一起,都在src/main/java下面。預設情況下這些檔案是不會打包的,因為只會打包serc/main/java下邊的xxx.java檔案(maven認為src/main/java只是java的原始碼路徑)。因此,我們就要指定xxx.xml檔案位置。
注意:下邊只寫了新增src/main/java的配置方法,設定之後resources會只有這一個。所以,應該把原來的路徑也新增上:src/main/resources。
build/resources
<build> <!---> 省略其他內容 <---> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
maven-resources-plugins
<build> <!---> 省略其他內容 <---> </plugins> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>2.5</version> <executions> <execution> <id>copy-xmls</id> <phase>process-sources</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${basedir}/target/classes</outputDirectory> <resources> <resource> <directory>${basedir}/src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin> </plugins> </build>
build-helper-maven-plugin
<build> <!---> 省略其他內容 <---> </plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>1.8</version> <executions> <execution> <id>add-resource</id> <phase>generate-resources</phase> <goals> <goal>add-resource</goal> </goals> <configuration> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin> </plugins> </build>
plugins
maven-resources-plugin
其他網址
Apache Maven Resources Plugin外掛詳解_成長的足跡-CSDN部落格
<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>
extensions
true or false, 決定是否要load這個plugin的extensions,預設為true。
inherited
是否讓子pom繼承,ture or false,預設為true
configuration
配置。通常用於私有不開源的plugin。
dependencies
與pom基礎的dependencies的結構和功能都相同,只是plugin的dependencies用於plugin,而pom的denpendencies用於專案本身。在plugin的dependencies主要用於改變plugin原來的dependencies,例如排除一些用不到的dependency或者修改dependency的版本等,詳細請看pom的denpendencies.
executions
plugin也有很多個目標,每個目標具有不同的配置,executions就是設定plugin的目標,
<execution> <id>echodir</id> <goals> <goal>run</goal> </goals> <phase>verify</phase> <inherited>false</inherited> <configuration> <tasks> <echo>Build Dir: ${project.build.directory}</echo> </tasks> </configuration> </execution>
id:識別符號
goals:裡面列出一系列的goals元素,例如上面的run goal
phase:宣告goals執行的時期,例如:verify
inherited:是否傳遞execution到子pom裡,預設為true。
configuration:設定execution下列表的goals的設定,而不是plugin所有的goals的設定
例項
增加src/main/java下邊的*.xml檔案。
<build> <!---> 省略其他內容 <---> </plugins> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>2.5</version> <executions> <execution> <id>copy-xmls</id> <phase>process-sources</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${basedir}/target/classes</outputDirectory> <resources> <resource> <directory>${basedir}/src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin> </plugins> </build>
build-helper-maven-plugin
其他網址
Maven配置原始碼和資源目錄_yh_zeng2的部落格-CSDN部落格
maven指定多個原始碼目錄_影子的部落格-CSDN部落格_maven 指定目錄
需求
有父工程(base)和多個子工程,父工程裡有公用的工具類和配置類,子工程要使用它。
寫法
<build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>1.8</version> <executions> <execution> <id>add-source</id> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>src/main/java</source> <source>../base</source> </sources> </configuration> </execution> </executions> </plugin> </plugins> </build>
然後,子專案把base原始碼加入Spring的掃描範圍即可。比如product子專案,在啟動類上添加註解:
@SpringBootApplication(scanBasePackages={"com.example.product", "com.example.base"})
注:上邊寫的<source>../base</source>是為了在顯示時比較好看,會把base和本專案並排在一起,如下圖所示:
如果這麼寫:<source>../base/src/main/java</source>,顯示如下(從java路徑開始並排):
這兩種寫法只會影響顯示效果。對程式碼沒有任何影響,比如,子專案的註解都用這種:
@SpringBootApplication(scanBasePackages={"com.example.product", "com.example.base"})
注意:以下寫法是不可以的,它只能指定一個原始碼路徑
<build> <!--預設原始碼目錄 --> <sourceDirectory>src/main/java</sourceDirectory> <!-- ${project.build.directory}就是我們通常看到的target目錄 --> <outputDirectory>${project.build.directory}/classes</outputDirectory> <!--預設測試原始碼目錄 --> <testSourceDirectory>src/test/java</testSourceDirectory> <testOutputDirectory>${project.build.directory}/test-classes </testOutputDirectory> <!--預設資源目錄 --> <resources> <resource> <directory>src/main/resources</directory> <excludes> <exclude>**/*.java</exclude> </excludes> </resource> </resources> <!--預設測試資源目錄 --> <testResources> <testResource> <directory>src/test/resources</directory> <excludes> <exclude>**/*.java</exclude> </excludes> </testResource> </testResources> </build>
其他
defaultGoal: 預設的目標,必須跟命令列上的引數相同,如:jar:jar,或者與時期parse相同,例如install
directory: 指定build target目標的目錄,預設為$(basedir}/target,即專案根目錄下的target
finalName: 指定生成的去掉字尾的工程(包)名字,預設為${artifactId}-${version}。
filters: 用於定義指定filter屬性的位置,例如filter元素賦值filters/filter1.properties,那麼這個檔案裡面就可以定義name=value對,這個name=value對的值就可以在工程pom中通過${name}引用,預設的filter目錄是${basedir}/src/main/fiters/
testResources: 測試資源元素,與resources類似,預設的測試資源路徑是${basedir}/src/test/resources,測試資源是不部署的。
pluginManagement:類似於denpendencyManagement。只是denpendencyManagement是用於管理專案jar包依賴,pluginManagement是用於管理plugin。與pom build裡的plugins區別是,這裡的plugin是列出來,然後讓子pom來決定是否引用。