介绍
Maven 本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成
插件
插件,plugin,生命周期的每一个阶段是由 Maven 插件 实现的
常用插件
maven-compiler-plugin:用于编译
maven-archetype-plugin:用于创建简单工程,通过目标
mvn archetype:generate调用maven-antrun-plugin:在 Maven 项目中运行 Ant 任务
目标
目标,goal ,每个任务对应了一个插件目标,每个插件会有一个或者多个目标
目标相当于调用插件的命令,如:
maven-compiler-plugin插件的compile目标,用来编译位于src/main/java/目录下的主源码maven-compiler-plugin插件的testCompile目标用来编译位于src/test/java/目录下的测试源码
调用插件目标
将插件目标与生命周期阶段(lifecycle phase)绑定,这样用户在命令行只是输入生命周期阶段而已,
例如 Maven 默认将maven-compiler-plugin的compile目标与compile生命周期阶段绑定,因此命令mvn compile实际上是先定位到compile这一生命周期阶段,然后再根据绑定关系调用maven-compiler-plugin的compile目标。直接在命令行指定要执行的插件目标,
例如mvn archetype:generate就表示调用maven-archetype-plugin插件 的generate目标,这种带冒号的调用方式与生命周期无关。
生命周期 vs 插件 vs 目标
生命周期和插件、目标是对应的,如下:
| 生命周期 | 目标 | 插件 |
|---|---|---|
| compile | compile | maven-compile-plugin |
| test-compile | testCompile | maven-compile-plugin |
例子
例子1
在pom.xml中配置,以spring-boot-maven-plugin插件为例,如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
source: 源代码编译版本;
target: 目标平台编译版本;
encoding: 字符集编码。
例子2
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<!-- 一个execution就是一个目标输入位置,如果想把各种资源拆开放的话,就
可以创建多个execution,一个资源文件可以被拷贝多份 -->
<execution>
<id>copy-resources</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<encoding>UTF-8</encoding>
<!-- 资源文件的输出目录 -->
<outputDirectory>{project.build.directory}/config</outputDirectory>
<resources>
<!-- 资源文件的原始目录,有多个的话就多配几个 -->
<resource>
<!-- 原始目录 -->
<directory>src/main/resources</directory>
<!-- 是否使用过滤器,如果是的话,需要配置一下才行-->
<filtering>true</filtering>
<!-- 包含哪些文件以及去除调哪些文件等等 -->
<includes>
<include>**/*.*</include>
</includes>
<excludes>
<exclude>**/*.json</exclude>
</excludes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<executions>标签
一个execution就是一个目标输入位置,如果想把各种资源拆开放的话,就可以创建多个execution,一个资源文件可以被拷贝多份
例子3
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.2.1.RELEASE</version>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
<fork> 标签
- true意味着它将创建(fork)一个新的jvm来运行编译器。这有点慢,但隔离效果更好。
特别是,您可以指定一个不同于maven启动时使用的jvm,并且您还可以仅在这种情况下指定命令行参数(for increasing Heapsize or Metaspace)。在您的情况下,它会导致问题,因为它似乎使用了错误的jvm,您可以指定full path with <executable>或toolchain configuration。
这是一种使用现代maven的方法,该方法不与java 1.6一起运行,但仍对较旧的源/目标版本使用干净的编译环境。 - false意味着它是直接在运行maven的jvm中的编译器startign,这使得构建的可重复性降低。