0

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

例如,一个“任务”是jar从用户提供的文件夹中获取一个文件,使用该命令将其安装在与我的一个 Maven 模块关联的本地 Maven 存储库中mvn install:install-file -DlocalRepositoryPath=repo,然后将该模块的 pom.xml 更改为指向新的jar 的版本。该任务与生命周期无关,它只是执行某些特定事情的一般任务,因此我不必手动执行,只要键入 eg 即可随时执行mvn task:update-jar

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

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

4

2 回答 2

1

如果您坚持让您的构建工作像这样,那么 Maven 将不是您的正确选择。

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

  1. 摇篮
  2. 常春藤+蚂蚁

它们为您提供使用 Maven 存储库的依赖管理的直接支持,同时让您完全控制构建脚本的流程。

于 2014-02-18T22:01:47.883 回答
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>
于 2014-02-18T17:15:00.637 回答