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>
我从 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>