Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
    Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。
    Maven本质上是一个插件框架,他定义好了POM后,由插件来完成构建功能。今天主要介绍一些常用的Maven框架。

一.清理插件

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-clean-plugin</artifactId>
</plugin>

    该插件用来删除在构建期间生成的文件或文件夹。扫描并删除以下文件夹:project.build.directory,project.build.outputDirectory,project.build.testOutputDirectory, and project.reporting.outputDirectory。
    使用方式: mvn clean

二.编译插件

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>

source: 源代码编译JDK版本
target:目标平台编译版本
encoding:字符集编码

    该插件包含两个goals:

  • compiler:compile编译mainSource,在适宜的阶段自动执行。
  • compiler:testCompile编译testSource,在适宜的阶段自动执行。

    使用方式: mvn compiler

三.资源插件

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.0.1</version>
    <executions>
        <execution>
            <id>copy-resources</id>
            <!-- 绑定到package阶段,自动执行 -->
            <phase>package</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <encoding>UTF-8</encoding>
                <outputDirectory>outputdir</outputDirectory>
                <resources>
                    <resource>
                        <includes>
                            <!-- 资源中包含的文件匹配符 -->
                            <include>*.txt</include>
                        </includes>
                        <filtering>true</filtering>
                    </resource>
                </resources>
        </execution>
    </executions>
</plugin>

    该插件用于复制指定的资源文件到output directory. 有三个goals:

  • resources:resources 复制主代码的资源文件到指定的输出目录中,一般是开发包下的资源文件(project.build.resources),也就是src/main/resources下的。一般用于资源文件的打包
  • resources:testResources复制测试代码的资源文件到指定的输出目录中,一般是测试包下的资源文件(project.build.testResources)。
  • resources:copy-resources复制指定的资源文件到指定的目录中。专用来在多模块中复制资源使用。

四.依赖插件

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.6</version>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <!-- 绑定到compile期间 -->
            <phase>compile</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                <!-- 表示是否不包含间接依赖的包 -->
                <excludeTransitive>false</excludeTransitive>
                <!-- 表示复制的jar文件去掉版本信息 -->
                <stripVersion>true</stripVersion>
            </configuration>
        </execution>
    </executions>
</plugin>

    该插件用于从本地或者远程的repository中复制(或/和)解压依赖的jar到指定的位置。当前插件的goals较多,在此就不一一列举了。列举常用的如下:
- dependency:copy将插件配置部分中定义的工件列表(<artifactItems>),并将其复制到指定的位置。
- dependency:copy-dependencies需要项目直接依赖项和可选传递依赖项的列表,并将它们复制到指定的位置。

五.打包插件

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <!-- 可以有多个descriptorRefs -->
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <!-- 可以指定一个特殊的descriptor -->
        <!-- 
        <descriptors>
            <descriptor>src/assembly/src.xml</descriptor>
        </descriptors>
        -->
        <!-- 绑定执行期间-->
        <executions>
            <execution>
                <id>make-assembly</id> <!-- this is used for inheritance merges -->
                <phase>package</phase> <!-- bind to the packaging phase -->
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executoins>
        <!-- 创建一个可执行的jar -->
        <archive>
            <manifest>
              <mainClass>org.sample.App</mainClass>
            </manifest>
         </archive>
    </configuration>
</plugin>

    该插件主要用于将依赖的jar,模块,site文档,其他的文件等聚合到一个单独的archive中。archive支持如下格式:
         - zip
         - tar
         - tar.gz (or tgz)
         - tar.bz2 (or tbz2)
         - jar
         - dir
         - war
         - and any other format that the ArchiveManager has been configured for

想要使用Assembly插件,你需要:

     - 选择或者写好一个descriptor去使用
     - 在你的项目中配置好Assembly插件
    - 在你的项目中执行 mvn assembly:single or mvn package