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