Maven“前”和“后”阶段

flo*_*w2k 4 maven

当我执行关联的阶段时,prepost阶段是否总是被执行?例如,如果我这样做mvn clean,这是否也会执行该mvn post-clean阶段?

我在看https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference,其中说:

下面列出了默认、清理和站点生命周期的所有构建阶段,它们按照指定的时间点之前的顺序执行

所以严格来说,既然post-clean是在之后clean,那么我就应该不执行mvn clean。但是我的直觉是不同的 - 虽然,我没有找到一种方法来验证这一点,因为 Maven 标准输出不打印它正在执行的阶段。

任何人都可以权衡答案以及您如何验证?

gly*_*ing 5

您可以将插件(例如echo-maven-plugin)绑定到clean生命周期的各个阶段,以帮助验证是否/何时执行每个阶段。

例如,给定以下插件定义:

<plugin>
    <groupId>com.github.ekryd.echo-maven-plugin</groupId>
    <artifactId>echo-maven-plugin</artifactId>
    <version>1.2.0</version>
    <executions>
        <execution>
            <id>pre-clean</id>
            <phase>pre-clean</phase>
            <goals>
                <goal>echo</goal>
            </goals>
            <configuration>
                <message>In 'pre-clean'</message>
            </configuration>
        </execution>
        <execution>
            <id>clean</id>
            <phase>clean</phase>
            <goals>
                <goal>echo</goal>
            </goals>
            <configuration>
                <message>In 'clean'</message>
            </configuration>
        </execution>
        <execution>
            <id>post-clean</id>
            <phase>post-clean</phase>
            <goals>
                <goal>echo</goal>
            </goals>
            <configuration>
                <message>In 'post-clean'</message>
            </configuration>
        </execution>
    </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

调用mvn clean将导致以下输出:

$ mvn clean
[INFO] Scanning for projects...
[INFO] 
[INFO] --- echo-maven-plugin:1.2.0:echo (pre-clean) @ sandbox ---
[INFO] In 'pre-clean'
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ sandbox ---
[INFO] Deleting target
[INFO] 
[INFO] --- echo-maven-plugin:1.2.0:echo (clean) @ sandbox ---
[INFO] In 'clean'
Run Code Online (Sandbox Code Playgroud)

所以,那里没有调用post-clean阶段。

调用mvn clean compile将导致以下输出:

$ mvn clean compile
[INFO] Scanning for projects...
[INFO] 
[INFO] --- echo-maven-plugin:1.2.0:echo (pre-clean) @ sandbox ---
[INFO] In 'pre-clean'
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ sandbox ---
[INFO] 
[INFO] --- echo-maven-plugin:1.2.0:echo (clean) @ sandbox ---
[INFO] In 'clean'
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ sandbox ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.5.1:compile (default-compile) @ sandbox ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 5 source files to ...
Run Code Online (Sandbox Code Playgroud)

同样,那里没有调用post-clean阶段。这意味着 maven-clean-plugin(也许没有别的)没有绑定到post-clean.

调用mvn post-clean 导致调用post-clean阶段...

$ mvn post-clean
[INFO] Scanning for projects...
[INFO] 
[INFO] --- echo-maven-plugin:1.2.0:echo (pre-clean) @ sandbox ---
[INFO] In 'pre-clean'
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ sandbox ---
[INFO] Deleting target
[INFO] 
[INFO] --- echo-maven-plugin:1.2.0:echo (clean) @ sandbox ---
[INFO] In 'clean'
[INFO] 
[INFO] --- echo-maven-plugin:1.2.0:echo (post-clean) @ sandbox ---
[INFO] In 'post-clean'
Run Code Online (Sandbox Code Playgroud)

因此,基于上述测试,我认为以下陈述是正确的:

  • post-clean不是当你调用调用clean
  • post-clean叫你时,明确调用post-clean(注:调用pre-post-阶段直接异常)

  • 我唯一一次“在那个阶段指定了 echo-maven-plugin 的执行”是当我调用 `mvn post-clean`(即在上面的第三个例子中)并且在那个时候 `post-clean` **是* * 调用。这不是 `echo-maven-plugin` 的特性,它只是反映了一个事实,即默认情况下没有任何东西调用 `post-clean`,相反 - 如果我们想要调用该阶段 - 我们必须显式调用它。 (2认同)