我从 Ant 转到了 Maven,我错过了一件事:执行任意任务的能力。我想摆脱蚂蚁的build.xml
但我仍然需要它。
有时我需要运行一些 XML 处理和 PDF 处理的统计信息。它们不是构建的一部分,但我无论如何都需要自动化它们。在 Ant 中,我过去只是编译并运行代码中的 java 类以使用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的设计目的不是为了帮助任何自动化,而只是解决"面向构建"的任务。是吗?
基本上,Maven定义了阶段,目标,插件和生命周期。
阶段:定义的生成生命周期中的阶段。
每个阶段都是一系列目标。
目标:目标负责特定任务。
插件:插件是一组目标(目标不一定都绑定到同一个阶段(。
生命周期:生命周期是一系列阶段。
话虽如此,有一组默认的Maven生命周期。
- 默认(负责处理项目部署的主生命周期 - 构建和部署项目 - ( 清洁
- (负责处理项目清洁的生命周期( 站点
- (生命周期负责创建项目的站点文档(
默认生命周期阶段
<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>
在默认生命周期中,没有定义默认阶段。这是因为在此生命周期中要执行的默认阶段是为每个包装(耳朵、罐子、战争、稀有、绒球等(特定定义的。请参阅默认生命周期绑定。
因此,如果您运行"mvn PHASE",例如。"mvn install"您将执行默认生命周期安装阶段以及所有先前阶段(这将执行除定义的">安装"之后的所有阶段,"部署"将不会执行(。
当您运行"mvn PLUGIN:GOAL"时,执行定义的插件目标,例如。'MVN 编译器:编译'。它将运行所有阶段,直到定义的阶段(以及这些阶段中的所有目标(,包括您定义的目标。
有一组插件可用于执行操作系统命令或 java 进程。还有一个插件可以运行有用的 Ant 任务。
Mojo Exec插件 mojo exec 插件参考
例如。使用命令行执行:
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 Antrun 插件 antrun 插件参考
例如。聚甲醛配置:
<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-antrun-plugin只有一个目标,run。
例如命令行执行:
mvn antrun:run
有关用法以及如何在pom中定义Ant目标的更多信息.xml: 用法
蚂蚁使用示例
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
您可以玩 网站生命周期...试试这个例子,看看如果你运行"mvn预站点",如何只执行在"预站点"阶段定义的ant任务。尝试运行"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>