Maven:在生命周期之外构建任务(更新/复制文件等)?

时间:2014-02-18 16:06:05

标签: java maven maven-antrun-plugin build-management

使用Maven时管理构建任务的流行方法是什么?我目前正在使用Maven进行依赖管理,但我需要定义几个可以独立于生命周期执行的“任务”,类似于Ant或Rake提供的内容;只是一个简单的“函数”,只要按名称调用它就会执行一系列步骤。

例如,一个“任务”是从用户提供的文件夹中获取jar文件,使用mvn install:install-file -DlocalRepositoryPath=repo命令将其安装在与我的一个maven模块关联的本地Maven存储库中,并将该模块的pom.xml更改为指向jar的新版本。这项任务与生命周期无关,只是做一些特定事情的一般任务,所以我不必手动完成任务,只要输入例如我想要的任何时间就可以执行。 mvn task:update-jar

另一个示例是“任务”,它删除我的一个maven模块内的目录内容,然后将内容从用户提供的目录复制到清空目录中。同样,这个任务与Maven或依赖项无关,但不要一直手动完成它。

人们如何编写这些任务 - 这一定是一个常见问题?我知道maven提供了antrun插件,但据我所知它只能绑定到Maven生命周期阶段,这不是我想要的。除了maven之外我还可以使用带有build.xml文件的Ant,但如果Maven能够以某种方式配置为自己做我想要的东西,那就太愚蠢了。此外,要求BOTH Maven和Ant来管理我的项目似乎不是最佳的。

2 个答案:

答案 0 :(得分:1)

如果你坚持让你的构建工作像这样,那么Maven对你来说不是一个正确的选择。

但是,如果您只是想要依赖关系管理,那么您还有其他选择,例如

  1. 摇篮
  2. 常春藤+蚂蚁
  3. 它们使用Maven存储库直接支持依赖关系管理,但是可以完全控制构建脚本的流程。

答案 1 :(得分:0)

您可以使用maven-antrun-plugin http://maven.apache.org/plugins/maven-antrun-plugin/

所以你可以使用像mvn antrun:run那样的命令行,其中run是你在pom.xml中定义的目标

使用此插件,您可以混合使用“maven-ant”并在maven中调用ant文件。谨慎使用它,因为您的项目配置可能是一个真正的混乱。

我的项目中用于替换不同文件中的属性的简单示例

<plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
      <!-- #1 : call antrun to merge projet with convinient conf files -->
      <execution>
        <id>replace</id>
        <phase>generate-resources</phase>
        <goals>
          <goal>run</goal>
        </goals>
        <configuration>
          <tasks>
            <ant antfile="replace.xml"/>
          </tasks>
        </configuration>
      </execution>
      <!-- #2 : call antrun to explode war created in target directory-->
      <execution>
        <id>unwar</id>
        <phase>install</phase>
        <configuration>
          <tasks>
            <!-- add conf folder (was ignored during war creation) -->
            <copy todir="./target/${project.artifactId}-${project.version}/conf">
              <fileset dir="./conf"/>
            </copy>

            <!-- rebuild war with conf folder newly added -->
            <delete>
                <fileset dir="./target">
                    <include name="${project.artifactId}-${project.version}.war"/>
                </fileset>
            </delete>
            <war basedir="./target/${project.artifactId}-${project.version}" destfile="./target/${project.artifactId}-${project.version}.war" webxml="./target/${project.artifactId}-${project.version}/WEB-INF/web.xml"/> 

            <!-- copy war and exploded webapp-->
            <copy todir="./${project.artifactId}/${project.version}/${project.artifactId}-${project.version}">
                <fileset dir="./target/${project.artifactId}-${project.version}"/>
            </copy>
            <copy file="./target/${project.artifactId}-${project.version}.war" todir="/devef/maven/repository/fr/as/galilei/${project.artifactId}/${project.version}"/>

          </tasks>
        </configuration>
        <goals>
          <goal>run</goal>
        </goals>
      </execution>
    </executions>
    <dependencies>
      <dependency>
        <groupId>ant</groupId>
        <artifactId>ant-nodeps</artifactId>
        <version>1.6.5</version>
      </dependency>
    </dependencies>
  </plugin>