Maven实战-第十四篇(Maven中的插件)

Maven实战-第十四篇(Maven中的插件)

一、什么是Maven中的插件

在上一篇中我们介绍了Maven的生命周期,并且我们也了解了它实际上的功能都是由插件来完成的。可见插件对于Maven来说是多么的重要。Maven也为我们项目构建提供了很多默认的插件支持。当然我们也可以配置额外的插件,甚至我们可以开发自己的插件来实现我们自己特有的功能。那么到底什么是Maven的插件呢?插件的本质其实就是构建目标的集合。构建目标也可以理解为上一篇中我们介绍过的Maven中生命周期的各个阶段。然后将插件与各个阶段进行绑定,进而实现Maven中插件功能的实现。

二、Maven中的插件如何配置

下面我们了解一下,如果何在Maven中配置插件。在Maven中我们可以通过下面的两种方式配置插件,下面我们详细介绍一下。

  • 命令行配置插件

下面我们以maven-surefire-plugin插件为例,来介绍一下如何通过命令行配置的方式来实现插件的功能。

maven-surefire-plugin插件中,它提供了一个maven.test.skip参数,并且这个参数可以通过命令行的方式配置(并不是所有的插件都支持这种方式配置)。这也是Maven方便我们配置插件额外参数提供了另一个功能。当上面参数设置为true时,我们可以在项目编译的时候跳过测试执行。该参数默认为flase。具体配置如下:

mvn install-D maven.test.skip=true

上面的参数-D是Java提供的,它的底层实现是通过命令行设置一个Java系统属性,Maven在执行时使用了该参数,从而实现了插件参数的配置。

下面我们通过代码演示一下,首先我们先执行mvn install来看一下Maven的执行日志。(需要项目中有相关的测试用例)

  • MazheMavenMallTest
import org.junit.Test;

public class MazheMavenMallTest {
    @Test
    public void test() {
        System.out.println("Hello World Mazhe Maven Mall Test!");
    }
}
  • 日志
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------< cn.ma-zhe:mazhe-maven-mall >---------------------
[INFO] Building mazhe-maven-mall 1.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ mazhe-maven-mall ---
[INFO] skip non existing resourceDirectory /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/src/main/resources
[INFO] 
[INFO] --- compiler:3.11.0:compile (default-compile) @ mazhe-maven-mall ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- resources:3.3.1:testResources (default-testResources) @ mazhe-maven-mall ---
[INFO] skip non existing resourceDirectory /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/src/test/resources
[INFO] 
[INFO] --- compiler:3.11.0:testCompile (default-testCompile) @ mazhe-maven-mall ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- surefire:3.1.2:test (default-test) @ mazhe-maven-mall ---
[INFO] Using auto detected provider org.apache.maven.surefire.junit4.JUnit4Provider
[INFO] 
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running MazheMavenMallTest
Hello World Mazhe Maven Mall Test!
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.065 s -- in MazheMavenMallTest
[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] 
[INFO] --- jar:3.3.0:jar (default-jar) @ mazhe-maven-mall ---
[INFO] 
[INFO] --- install:3.1.1:install (default-install) @ mazhe-maven-mall ---
[INFO] Installing /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/pom.xml to /Users/md/.m2/repository/cn/ma-zhe/mazhe-maven-mall/1.0-SNAPSHOT/mazhe-maven-mall-1.0-SNAPSHOT.pom
[INFO] Installing /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/target/mazhe-maven-mall-1.0-SNAPSHOT.jar to /Users/md/.m2/repository/cn/ma-zhe/mazhe-maven-mall/1.0-SNAPSHOT/mazhe-maven-mall-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.753 s
[INFO] Finished at: 2023-08-02T05:57:14+08:00
[INFO] ------------------------------------------------------------------------

我们看日志输出,Maven执行了测试用例的代码。但测试用例是我们开发中测试的代码,在某些情况下,我们是不想让项目启动时让它运行的,那怎么能不让它执行呢。这也就是上面介绍的,可以通过命令行配置的方式,不让它执行,也就是修改了插件默认的规则。这次我们不在执行mvn install命令,而是执行mvn install -D maven.test.skip=true。我们再次观察一下日志。

  • 日志
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------< cn.ma-zhe:mazhe-maven-mall >---------------------
[INFO] Building mazhe-maven-mall 1.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ mazhe-maven-mall ---
[INFO] skip non existing resourceDirectory /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/src/main/resources
[INFO] 
[INFO] --- compiler:3.11.0:compile (default-compile) @ mazhe-maven-mall ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- resources:3.3.1:testResources (default-testResources) @ mazhe-maven-mall ---
[INFO] Not copying test resources
[INFO] 
[INFO] --- compiler:3.11.0:testCompile (default-testCompile) @ mazhe-maven-mall ---
[INFO] Not compiling test sources
[INFO] 
[INFO] --- surefire:3.1.2:test (default-test) @ mazhe-maven-mall ---
[INFO] Tests are skipped.
[INFO] 
[INFO] --- jar:3.3.0:jar (default-jar) @ mazhe-maven-mall ---
[INFO] 
[INFO] --- install:3.1.1:install (default-install) @ mazhe-maven-mall ---
[INFO] Installing /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/pom.xml to /Users/md/.m2/repository/cn/ma-zhe/mazhe-maven-mall/1.0-SNAPSHOT/mazhe-maven-mall-1.0-SNAPSHOT.pom
[INFO] Installing /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/target/mazhe-maven-mall-1.0-SNAPSHOT.jar to /Users/md/.m2/repository/cn/ma-zhe/mazhe-maven-mall/1.0-SNAPSHOT/mazhe-maven-mall-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.052 s
[INFO] Finished at: 2023-08-02T06:10:21+08:00
[INFO] ------------------------------------------------------------------------

我们看日志输出,这次Maven就自动为我们跳过测试用例的执行了。上面的命令还有一种简单的写法,就是mvn install -DskipTests方式。我们先看一下日志,然后在说明一下,这两处命令的区别。

  • 日志
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------< cn.ma-zhe:mazhe-maven-mall >---------------------
[INFO] Building mazhe-maven-mall 1.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ mazhe-maven-mall ---
[INFO] skip non existing resourceDirectory /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/src/main/resources
[INFO] 
[INFO] --- compiler:3.11.0:compile (default-compile) @ mazhe-maven-mall ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- resources:3.3.1:testResources (default-testResources) @ mazhe-maven-mall ---
[INFO] skip non existing resourceDirectory /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/src/test/resources
[INFO] 
[INFO] --- compiler:3.11.0:testCompile (default-testCompile) @ mazhe-maven-mall ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- surefire:3.1.2:test (default-test) @ mazhe-maven-mall ---
[INFO] Tests are skipped.
[INFO] 
[INFO] --- jar:3.3.0:jar (default-jar) @ mazhe-maven-mall ---
[INFO] 
[INFO] --- install:3.1.1:install (default-install) @ mazhe-maven-mall ---
[INFO] Installing /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/pom.xml to /Users/md/.m2/repository/cn/ma-zhe/mazhe-maven-mall/1.0-SNAPSHOT/mazhe-maven-mall-1.0-SNAPSHOT.pom
[INFO] Installing /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/target/mazhe-maven-mall-1.0-SNAPSHOT.jar to /Users/md/.m2/repository/cn/ma-zhe/mazhe-maven-mall/1.0-SNAPSHOT/mazhe-maven-mall-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.034 s
[INFO] Finished at: 2023-08-02T06:14:35+08:00
[INFO] ------------------------------------------------------------------------

通过日志我们知道,这个命令同样的跳过了测试用例的执行,那么mvn install -D maven.test.skip=truemvn install -DskipTests这两个命令到底有什么区别呢?

  • mvn install -D maven.test.skip=true

跳过测试用例的执行,不会生成测试类的class文件。

Maven实战-第十四篇(Maven中的插件)

  • mvn install -DskipTests

跳过测试用例的执行,但是依然会生成测试类的class文件。

Maven实战-第十四篇(Maven中的插件)


  • POM中配置插件

下面我们介绍一下另外一种配置插件的方式。实际上在Maven中并不是所有插件都支持参数配置,并且支持参数配置的插件都是一些经常需要变参数的插件,还有一些不需要改变的插件,也就是我们可以进行全局配置。Maven中有很多的插件可以进行配置我们以maven-compiler-plugin插件配置为例。该插件的作用是配置项目编译的JDK的版本。具体的配置如下:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

当我们配置完上述内容后,Maven在执行的时,就会按照我们指定的JDK的版本进行编译,这也是Maven插件意义所在,在实际的项目开发中,我们推荐使用pom中的方式配置插件,因为这样可以复用,方便我们在次使用。

三、Maven如何开发自己的插件

通过上面的内容,我们已经知道了什么是Maven的插件了,并且我们也知道如何配置Maven插件了,下面我们介绍一下,如何开发自己的插件,通过开发自己的插件,可以让我们更加深入的理解Maven中插件的底层实现与使用技巧。由于插件的作用是实现某些功能,我们以简单的的一种场景为例,来介绍一下如何开发自己的Maven插件。开发Maven的插件,主要有以下步骤:

1、创建一个Maven的项目,并且这个项目的packaging必须是maven-plugin
2、为插件设置构建的目标,也就是Maven中的Mojo,编写插件的时候,必须提供一个或者多个继承AbstractMojo类。
3、为目标提供配置参数,因为大部分的Maven插件的目标是可以配置的,所以在编写Mojo时需要添加可配置参数的支持。
4、编写目标的实现,也就是Mojo的实际处理功能。
5、处理日志信息,当Mojo处理异常时,代码中要编写必要的日志,以便用户提供信息,方便排查。
6、测试插件,编写自动化测试代码的行为,然后运行插件时,验证其行为。

下面我们按照上面的步骤,来实际操作一下。首先我们创建一个项目。

Maven实战-第十四篇(Maven中的插件)

下面我们修改一下项目的packaging,配置packagingmaven-plugin。除此之外,我们还需要引入一个依赖,因为上面第二步介绍 ,我们需要继承AbstractMojo。所以这个依赖类就是这个依赖包中,并且初了这个依赖类外,这个依赖包还提供了所有Maven插件开发的所依赖的其它的类。具体的配置如下:

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.ma-zhe</groupId>
    <artifactId>mazhe-maven-plugin</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>maven-plugin</packaging>

    <dependencies>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-plugin-api</artifactId>
            <version>3.2.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugin-tools</groupId>
            <artifactId>maven-plugin-annotations</artifactId>
            <version>3.7.1</version>
        </dependency>
    </dependencies>
</project>

下面我们开发具体的Mojo的实现。

  • MazheMavenMojo
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;

@Mojo(name = "mazhe")
public class MazheMavenMojo extends AbstractMojo {
    @Parameter(property = "path", defaultValue = "${project.build.gargetDirectory}")
    private String path;

    public void execute() {
        getLog().info(String.format("Hello, world Mazhe Maven Plugin %s!", path));
    }
}

自定义的Mojo必须继承AbstractMojo类,并且还需要实现execute()方法,因为只有这样Maven才能识别出这个插件的目标。我们先简单输出一句话,先验证Maven能否识别出我们自己开发的插件。因为插件是给其它项目使用的,所以我们将我们刚刚写好的插件,安装到本地仓库中,然后让其它项目引用,安装到本地仓库的命令也就是下面的命令:

mvn install

我们还是用之前介绍过的mazhe-maven-mall项目为例,在这个项目配置我们自己的插件的信息,具体配置如下:

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>midai-mazhe-maven</artifactId>
        <groupId>cn.ma-zhe</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>mazhe-maven-mall</artifactId>
    <build>
        <plugins>
            <plugin>
                <groupId>cn.ma-zhe</groupId>
                <artifactId>mazhe-maven-plugin</artifactId>
                <version>1.0-SNAPSHOT</version>
                <executions>
                    <execution>
                        <phase>compile</phase>
                        <goals>
                            <goal>mazhe</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

上面我一些标签,我们已经非常熟悉了,我们就不在过多介绍了,我们介绍一下executions标签中的phasegoals

  • phase:作用是将该目标绑定的在Maven中生命周期的哪个阶段。也就是我们自己编写的插件,我们希望在执行Maven的哪个命令生效。
  • goal:指定我们插件目标的名称。在Maven调用时使用这个名称。

当然还有其它的配置信息,我们先不过多介绍,我们先验证我们上面的功能,后续我们在详细介绍executions中相关的配置。我们看上面的配置phase中我们配置的是compile,所以也就是说,我们的插件将自动绑定到项目编译的生命周期中。下面我们执行一下命令,来看一下Maven日志输出的结果。

  • 编译
mvn compile
  • 日志
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------< cn.ma-zhe:mazhe-maven-mall >---------------------
[INFO] Building mazhe-maven-mall 1.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ mazhe-maven-mall ---
[INFO] skip non existing resourceDirectory /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/src/main/resources
[INFO] 
[INFO] --- compiler:3.11.0:compile (default-compile) @ mazhe-maven-mall ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- mazhe:1.0-SNAPSHOT:mazhe (default) @ mazhe-maven-mall ---
[INFO] Hello, world Mazhe Maven Plugin /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall!
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.166 s
[INFO] Finished at: 2023-08-04T06:23:29+08:00
[INFO] ------------------------------------------------------------------------

我们看上面的日志输出,成功的输出了,我们插件中的信息了,这就是Maven中插件的开发,开发难度还是非常简单的。但上面的插件并没有任何实际的意义,下面我们开发一下相对来说有意义的插件。我们知道在Maven中执行clean时会自动将Maven中的target目录给清理掉,下面我们开发一个功能,在执行清理之前,我们将target中的依赖包内容进行备份。下面看一下具体的代码。

  • MazheMavenMojo
import cn.hutool.core.io.FileUtil;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;

@Mojo(name = "mazhe")
public class MazheMavenMojo extends AbstractMojo {
    @Parameter(property = "path", defaultValue = "${project.build.directory}")
    private String path;

    @Parameter(property = "artifactId", defaultValue = "${project.artifactId}")
    private String artifactId;

    @Parameter(property = "version", defaultValue = "${project.version}")
    private String version;

    public void execute() {
        String jar = String.format("%s/%s-%s.jar", path, artifactId, version);
        FileUtil.copy(jar, jar.replace("target", "bak"), true);
    }
}

上面配置中使用了@Parameter参数,该参数的作用是引入配置变量,并且我们指定的了默认的配置参数,也就是项目编译的目录。下面我们同样的安装一下,然后在依赖项目中在执行一下。

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>midai-mazhe-maven</artifactId>
        <groupId>cn.ma-zhe</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>mazhe-maven-mall</artifactId>
    <build>
        <plugins>
            <plugin>
                <groupId>cn.ma-zhe</groupId>
                <artifactId>mazhe-maven-plugin</artifactId>
                <version>1.0-SNAPSHOT</version>
                <executions>
                    <execution>
                        <phase>pre-clean</phase>
                        <goals>
                            <goal>mazhe</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

因为上面中phase参数我们配置是pre-clean。也就是绑定的是清理前的生命周期,所以我们插件的作用才能启作用,在项目被清理之前开始备份。所以phase参数是我们Maven插件开发中非常重要的参数。下面我们执行一下清理命令,看一下日志输出。

  • 清理
mvn clean
  • 日志
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------< cn.ma-zhe:mazhe-maven-mall >---------------------
[INFO] Building mazhe-maven-mall 1.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- mazhe:1.0-SNAPSHOT:mazhe (default) @ mazhe-maven-mall ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.691 s
[INFO] Finished at: 2023-08-04T22:41:10+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal cn.ma-zhe:mazhe-maven-plugin:1.0-SNAPSHOT:mazhe (default) on project mazhe-maven-mall: Execution default of goal cn.ma-zhe:mazhe-maven-plugin:1.0-SNAPSHOT:mazhe failed: File not exist: /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/target/mazhe-maven-mall-1.0-SNAPSHOT.jar -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException

我们看上面的日志报错了,并且日志输出的非常明显,没有找到相应的文件。那是因为我们并没有对target目录进行判断,因为我们没有先编译项目,所以项目中并没有这个目录,下面我们先打包一下项目然后在执行清理命令看一下效果。

  • 打包
mvn package
  • 日志
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------< cn.ma-zhe:mazhe-maven-mall >---------------------
[INFO] Building mazhe-maven-mall 1.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ mazhe-maven-mall ---
[INFO] skip non existing resourceDirectory /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/src/main/resources
[INFO] 
[INFO] --- compiler:3.11.0:compile (default-compile) @ mazhe-maven-mall ---
[INFO] Changes detected - recompiling the module! :source
[INFO] Compiling 1 source file with javac [debug target 8] to target/classes
[INFO] 
[INFO] --- resources:3.3.1:testResources (default-testResources) @ mazhe-maven-mall ---
[INFO] skip non existing resourceDirectory /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/src/test/resources
[INFO] 
[INFO] --- compiler:3.11.0:testCompile (default-testCompile) @ mazhe-maven-mall ---
[INFO] Changes detected - recompiling the module! :source
[INFO] Compiling 1 source file with javac [debug target 8] to target/test-classes
[INFO] 
[INFO] --- surefire:3.1.2:test (default-test) @ mazhe-maven-mall ---
[INFO] Using auto detected provider org.apache.maven.surefire.junit.JUnit3Provider
[INFO] 
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running MazheMavenMallTest
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.018 s -- in MazheMavenMallTest
[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] 
[INFO] --- jar:3.3.0:jar (default-jar) @ mazhe-maven-mall ---
[INFO] Building jar: /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/target/mazhe-maven-mall-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.780 s
[INFO] Finished at: 2023-08-04T22:49:07+08:00
[INFO] ------------------------------------------------------------------------

下面我们在执行清理命令,看一下日志。

  • 清理
mvn clean
  • 日志
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------< cn.ma-zhe:mazhe-maven-mall >---------------------
[INFO] Building mazhe-maven-mall 1.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- mazhe:1.0-SNAPSHOT:mazhe (default) @ mazhe-maven-mall ---
[INFO] 
[INFO] --- clean:3.2.0:clean (default-clean) @ mazhe-maven-mall ---
[INFO] Deleting /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/target
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.834 s
[INFO] Finished at: 2023-08-04T22:50:34+08:00
[INFO] ------------------------------------------------------------------------

我们看日志执行成功了,我们看一下项目目录是否成功的备份了之前的依赖包。

Maven实战-第十四篇(Maven中的插件)

我们看项目目录中成功的备份了我们的依赖包。以上内容就是我们Maven中插件开发的主要内容。下面我们在介绍一下,上面开发中涉及到的一此配置信息。

  • Maven内置属性
属性 描述
${project.build.sourceDirectory} 项目的源码目录,也就是src/main/java。
${project.build.testSourceDirectory} 项目测试源码目录,也就是src/test/java。
${project.build.directory} 项目的构建目录,也就是target目录。
${project.outputDirectory} 项目源码的编译目录,也就是target/classes目录。
${project.testOutputDirector} 项目的测试源码编译目录,也就是target/test-classes目录。
${project.groupId} 项目的groupId。
${project.artifactId} 项目的artifactId。
${project.version} 项目的version。
${project.build.finalName} 项目的打包名称。
  • phase
阶段 描述
pre-clean 在实际项目清理之前执行所需的流程。
clean 删除上一个版本生成的所有文件。
post-clean 执行完成项目清理所需的流程。
validate 验证项目是否正确,并且所有必要的信息都可用。
initialize 初始化构建状态,例如设置属性或创建目录。
generate-sources 生成任何源代码以包含在编译中。
process-sources 处理源代码,例如过滤任何值。
generate-resources 生成资源以纳入一揽子计划。
process-resources 将资源复制并处理到目标目录中,准备打包。
compile 编译项目的源代码。
process-classes 后处理编译中生成的文件,例如在Java类上进行字节码增强。
generate-test-sources 生成任何测试源代码以包含在编译中。
process-test-sources 处理测试源代码,例如过滤任何值。
generate-test-resources 为测试创建资源。
process-test-resources 将资源复制并处理到测试目标目录中。
test-compile 将测试源代码编译到测试目标目录中
process-test-classes 后处理测试编译中生成的文件,例如在Java类上进行字节码增强。
test 使用合适的单元测试框架运行测试。这些测试不应要求打包或部署代码。
prepare-package 在实际包装之前执行任何准备包装所需的操作。这通常会导致包装的、处理的包裹版本。
package 获取编译后的代码,并将其打包为可分发格式,例如JAR。
pre-integration-test 在执行集成测试之前执行所需的操作。这可能涉及设置所需的环境等事情。
integration-test 如有必要,处理并将软件包部署到可以运行集成测试的环境中。
post-integration-test 执行集成测试后执行所需的操作。这可能包括清理环境。
verify 运行任何检查以验证软件包是否有效并符合质量标准。
install 将软件包安装到本地存储库中,作为本地其他项目的依赖项使用。
deploy 在集成或发布环境中完成,将最终软件包复制到远程存储库,以便与其他开发人员和项目共享。

给TA打赏
共{{data.count}}人
人已打赏
Maven

Maven实战-第十三篇(Maven的生命周期)

2023-8-1 6:16:29

Maven

Maven实战-第十五篇(Maven中的聚合)

2023-8-7 6:41:15