maven 插件和目标

介绍

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/目录下的测试源码

调用插件目标

  1. 将插件目标与生命周期阶段(lifecycle phase)绑定,这样用户在命令行只是输入生命周期阶段而已,
    例如 Maven 默认将 maven-compiler-plugin 的 compile 目标与 compile 生命周期阶段绑定,因此命令mvn compile实际上是先定位到 compile 这一生命周期阶段,然后再根据绑定关系调用 maven-compiler-plugin 的 compile 目标。

  2. 直接在命令行指定要执行的插件目标,
    例如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,这使得构建的可重复性降低。

原文出处:/show_1EF5g3BqoUlE.html