1. 程式人生 > 其它 >maven系列--pom.xml(build元素)

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官網

簡介

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詳解

指定資原始檔

其他網址

Mybatis系列--問題解決_feiying0canglang的部落格-CSDN部落格

簡介

如果我們的資源不在預設的路徑下邊,那麼就要手動去指定它。方法如下:

  1. 設定build/resources
  2. 使用maven-resources-plugin外掛
  3. 使用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來決定是否引用。