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