1.1 在 Maven 中構建的插件列表
Maven 中的組件可以非常靈活地配置。Maven開發者專門打造了幾十個插件,使用它們可以非常靈活地配置各種構建。其中最受歡迎的如下表所示:
插入 | 描述 | |
---|---|---|
1個 | maven編譯器插件 | 管理 Java 編譯 |
2個 | maven資源插件 | 控制資源在程序集中的包含 |
3個 | maven源碼插件 | 控製程序集中是否包含源代碼 |
4個 | maven依賴插件 | 控制複製依賴庫的過程 |
5個 | maven-jar-插件 | 用於創建最終 jar 文件的插件 |
6個 | maven 戰爭插件 | 用於創建最終戰爭文件的插件 |
7 | maven-surefire-插件 | 管理測試運行 |
8個 | buildnumber-maven-插件 | 生成內部版本號 |
每個插件都有自己的有趣之處,但我們必須對它們進行分析。讓我們從主要的事情開始——編譯管理插件。
1.2 編譯插件maven-compiler-plugin
允許您控制編譯器版本並在幾乎所有項目中使用的最流行的插件是maven-compiler-plugin
. 它有默認設置,但在幾乎每個項目中都需要重新設置。
最簡單的版本,在插件中,需要指定Java源代碼的版本和進行組裝的Java機器的版本:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.11</source>
<target>1.13</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
在上面的示例中,我們設置了三個 Java 編譯器選項:source
,target
和encoding
。
該參數source
允許我們為源代碼設置 Java 版本。該參數target
是要在其下編譯類的 Java 機器的版本。如果未指定代碼或 Java 機器版本,則默認為 1.3
最後,該參數encoding
允許您指定 Java 文件的編碼。我們指出UTF-8
。現在幾乎所有的資源都存儲在UTF-8
. 但如果不指定該參數,則將選擇操作系統的當前編碼。對於 Windows,這是編碼Windows-1251
。
也有構建計算機安裝了多個版本的 Java 的情況:構建不同的模塊和/或不同的項目。在這種情況下,JAVA_HOME
只能在變量中指定其中之一的路徑。
此外,還有Java機器的不同實現:OpenJDK、OracleJDK、Amazon JDK。項目越大,其結構就越複雜。但是您可以使用標記為插件顯式設置 javac 編譯器的路徑
該插件maven-compiler-plugin
有兩個目標:
compiler:compile
– 編譯源代碼,默認與編譯階段相關聯compiler:testCompile
– 測試編譯,默認情況下它與測試編譯階段相關聯。
您還可以在命令行上指定要傳遞給 javac 編譯器的參數列表:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<compilerArgs>
<arg>-verbose</arg> <arg>-Xlint:all,-options,-path<arg>
</compilerArgs>
</configuration>
</plugin>
1.3 創建jar文件的插件maven-jar-plugin
如果你想用 Maven 構建你自己的 jar 庫,你將需要 maven-jar-plugin。這個插件做了很多有用的事情。
這種插件的一個例子:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<includes> <include>**/properties/*</include> </includes>
<archive> <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile> </archive>
</configuration>
</plugin>
首先,它可用於指定哪些文件將進入庫,哪些不會。使用<include>
節中的標籤,<includes>
您可以指定一個目錄列表,其內容需要添加到庫中。
其次,每個 jar 必須有一個清單(MANIFEST.MF文件)。插件本身會將它放在庫中的正確位置,您只需要指定要採用的路徑即可。標籤用於此<manifestFile>
。
最後,插件可以自行生成清單。為此,<manifestFile>
您需要添加一個標籤<manifest>
並在其中為未來的清單指定數據,而不是標籤。例子:
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.codegym.MainApplication</mainClass>
</manifest>
</archive>
</configuration>
該標記<addClasspath>
指定是否添加到清單中CLASSPATH
。
該標記<classpathPrefix>
允許您在每個資源之前添加一個前綴(在示例庫中)。指定前綴<classpathPrefix>
允許您將依賴項放在單獨的文件夾中。
是的,您可以將庫放在另一個庫中。而當你需要傳遞某個地方的properties文件的路徑時,有很多驚喜在等著你,它在jar庫中,在jar庫中。
最後,標記<mainClass>
指向主要的可執行類。“ 主要的可執行類是什麼?“, - 你問。問題是 Java 機器不僅可以運行由 Java 類指定的程序,還可以運行由 jar 文件指定的程序。對於這種情況,需要主要的起始類。
1.4 構建號生成插件buildnumber-maven-plugin
通常,jar 庫和 war 文件包含項目名稱及其版本以及程序集版本的信息。這不僅對管理依賴關係有用,而且還簡化了測試:很清楚錯誤是在哪個版本的庫中修復的,以及它是在哪個版本中添加的。
大多數情況下,這個任務是這樣解決的 - 他們創建一個application.properties
包含所有必要信息的特殊文件並將其包含在程序集中。您還可以配置構建腳本,以便將此文件中的數據遷移到MANIFEST.MF
etc.
但最有趣的是,Maven 有一個特殊的插件可以生成這樣的 application.properties 文件。為此,您需要創建這樣一個文件並用特殊的數據模板填充它。例子:
# application.properties
app.name=${pom.name} app.version=${pom.version} app.build=${buildNumber}
所有三個參數的值將在構建階段被替換。
參數pom.name
和pom.version
將直接取自pom.xml
. 為了在 Maven 中生成唯一的內部版本號,有一個特殊的插件 - buildnumber-maven-plugin
. 請參見下面的示例:
<packaging>war</packaging>
<version>1.0</version>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId> <artifactId>buildnumber-maven-plugin</artifactId> <version>1.2</version>
<executions> <execution> <phase>validate</phase> <goals> <goal>create</goal> </goals> </execution> </executions>
<configuration> <revisionOnScmFailure>true</revisionOnScmFailure> <format>{0}-{1,date,yyyyMMdd}</format> <items> <item>${project.version}</item> <item>timestamp</item> </items> </configuration>
</plugin>
</plugins>
在上面的示例中,發生了三件重要的事情。首先,插件本身指定用於設置程序集版本。其次,指定它將在驗證階段(第一個階段)運行並生成內部版本號 - ${buildNumber}
。
第三,指明了這個裝配編號的格式,它是由幾個部分粘合在一起的。project.version
這是模板給出的項目版本和當前時間。模板格式由 Java 類指定MessageFormat
。
GO TO FULL VERSION