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,targetencoding

該參數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.MFetc.

但最有趣的是,Maven 有一個特殊的插件可以生成這樣的 application.properties 文件。為此,您需要創建這樣一個文件並用特殊的數據模板填充它。例子:

# application.properties
app.name=${pom.name}
app.version=${pom.version}
app.build=${buildNumber}

所有三個參數的值將在構建階段被替換。

參數pom.namepom.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