Maven 运行 非构建任务可以吗?

Can Maven run non-build tasks?

我从 Ant 转到 Maven,但我错过了一件事:执行任意任务的能力。我想摆脱 Ant 的 build.xml 但我仍然需要它。

偶尔我需要 运行 一些 XML 处理和 PDF 处理的统计数据。 它们不是构建的一部分,但无论如何我都需要自动化它们。在 Ant 中,我过去只是编译 运行 代码中的 java class 以使用 java Ant 任务,例如:

<target name="gen-stats">
  <java classname="com.utl.StatsGen" classpath="build" />
</target>

<target name="compute-complexity">
  <java classname="com.utl.PDFComplexity" classpath="lib/pdf-cpx.jar" />
</target>

试图让我的大脑围绕它。也许 Maven 的设计目的不是为了帮助 任何自动化 ,而只是解决 "build oriented" 任务。是吗?

基本上,Maven定义阶段目标插件 生命周期 .

阶段:定义构建期间的一个阶段生命周期
每个 阶段 是一个 目标序列

目标目标负责特定的任务

插件:一个插件一组目标目标不一定都绑定到相同的阶段)。

生命周期:一个生命周期阶段[的序列.

话虽如此,Maven 有一组默认的 Lifecycles

  • 默认(负责处理项目部署的主要生命周期-构建和部署您的项目-)
  • clean(负责处理项目清理的生命周期)
  • 站点(负责创建项目站点文档的生命周期)

默认生命周期阶段

<phases>
  <phase>validate</phase>
  <phase>initialize</phase>
  <phase>generate-sources</phase>
  <phase>process-sources</phase>
  <phase>generate-resources</phase>
  <phase>process-resources</phase>
  <phase>compile</phase>
  <phase>process-classes</phase>
  <phase>generate-test-sources</phase>
  <phase>process-test-sources</phase>
  <phase>generate-test-resources</phase>
  <phase>process-test-resources</phase>
  <phase>test-compile</phase>
  <phase>process-test-classes</phase>
  <phase>test</phase>
  <phase>prepare-package</phase>
  <phase>package</phase>
  <phase>pre-integration-test</phase>
  <phase>integration-test</phase>
  <phase>post-integration-test</phase>
  <phase>verify</phase>
  <phase>install</phase>
  <phase>deploy</phase>
</phases>

清理生命周期阶段

<phases>
  <phase>pre-clean</phase>
  <phase>clean</phase>
  <phase>post-clean</phase>
</phases>
<default-phases>
  <clean>
    org.apache.maven.plugins:maven-clean-plugin:2.5:clean
  </clean>
</default-phases>

站点生命周期阶段

<phases>
  <phase>pre-site</phase>
  <phase>site</phase>
  <phase>post-site</phase>
  <phase>site-deploy</phase>
</phases>
<default-phases>
  <site>
    org.apache.maven.plugins:maven-site-plugin:3.3:site
  </site>
  <site-deploy>
    org.apache.maven.plugins:maven-site-plugin:3.3:deploy
  </site-deploy>
</default-phases>

你看,在 default 生命周期中没有定义 default-phases。这是因为在这个生命周期中要执行的默认阶段是为每个包装(ear、jar、war、rar、pom 等)特定定义的。参见 default lifecycle bindings

因此,如果您 运行 'mvn PHASE' 例如。 'mvn install' 你将执行默认的生命周期 INSTALL 阶段和所有前面的阶段(这将执行所有阶段,除了定义 'install','deploy' 不会被执行).

当您 运行 'mvn PLUGIN:GOAL' 执行定义的插件目标时,例如。 'mvn compiler:compile'。它将 运行 所有阶段直至定义的阶段(以及这些阶段中的所有目标),包括您定义的目标。


有一组插件可用于执行 OS 命令或 java 进程。 运行 Ant tasks 的插件也很有用。

Mojo Exec 插件 mojo exec plugin reference

例如。使用命令行执行:

mvn exec:java -Dexec.mainClass="com.example.Main" [-Dexec.args="argument1"] ...

例如。使用 POM 配置执行:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.6.0</version>
        <executions>
          <execution>
            ...
            <goals>
              <goal>java</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <mainClass>com.example.Main</mainClass>
          <arguments>
            <argument>argument1</argument>
            ...
          </arguments>
          <systemProperties>
            <systemProperty>
              <key>myproperty</key>
              <value>myvalue</value>
            </systemProperty>
            ...
          </systemProperties>
        </configuration>
      </plugin>
    </plugins>
  </build>
   ...
</project>

Maven Ant运行 插件 antrun plugin reference

例如。 POM 配置:

<project>
  ...
  <build>
    <!-- To define the plugin version in your parent POM -->
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.8</version>
        </plugin>
        ...
      </plugins>
    </pluginManagement>
    <!-- To use the plugin goals in your POM or parent POM -->
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.8</version>
      </plugin>
      ...
    </plugins>
  </build>
  ...
</project>

maven-ant运行-插件只有一个目标,运行。

例如。命令行执行:

mvn antrun:run

更多关于用法以及如何在 pom.xml 中定义 Ant 目标的信息: usage

Ant运行 用法示例

1 - 添加这样的插件定义:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.8</version>
    <executions>
         <execution>
            <id>my-gen-stats-task</id>
            <phase>pre-site</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <target>
                    <ant antfile="${basedir}/build.xml">
                        <target name="gen-stats"/>
                    </ant>
                </target>
            </configuration>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>1.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant-commons-net</artifactId>
            <version>1.8.1</version>
        </dependency>
    </dependencies>
</plugin>

2 - 执行您定义的 Maven 阶段:

mvn pre-site

您可以玩 SITE 生命周期...试试这个例子,看看如果您 运行 'mvn pre-site' 只执行在 'pre-site' 阶段定义的 ant 任务。试试 运行ning 'mvn site' 看看 'pre-site' 和 'site' 任务是如何执行的:

例如

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.8</version>
                <executions>
                    <execution>
                        <id>my-pre-site</id>
                        <phase>pre-site</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <tasks>
                                <echo>PRE-SITE PHASE!!!</echo>
                            </tasks>
                        </configuration>
                    </execution>
                    <execution>
                        <id>my-site</id>
                        <phase>site</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <tasks>
                                <echo>SITE PHASE!!!</echo>
                            </tasks>
                        </configuration>
                    </execution>
                    <execution>
                        <id>my-post-site</id>
                        <phase>post-site</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <tasks>
                                <echo>POST-SITE PHASE!!!</echo>
                            </tasks>
                        </configuration>
                    </execution>
                    <execution>
                        <id>my-site-deploy</id>
                        <phase>site-deploy</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <tasks>
                                <echo>SITE DEPLOY PHASE!!!</echo>
                            </tasks>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
</build>