1

我正在将 ant 转换为 maven2。在 build.xml 中,我有:

<target name="clean">
  <delete file="${dir.dist}/${api.jarfile}" />
  <delete dir="${dir.build}/**" />
</target>
<target name="prepare1" depends="clean">
  <mkdir dir="${dir.build}" />
  <mkdir dir="${dir.generated.code.junit}/build" />
  <mkdir dir="${dir.dist}" />
</target>
<target name="prepare2" depends="clean">
  <mkdir dir="${dir.deploy}" />
  <mkdir dir="${dir.dist}" />
</target>

我正在使用 maven-antrun-plugin,它在第一个目标上运行良好。但是,对于第二个目标,antrun 不支持“依赖”。我可以做一个技巧:将第一个目标置于清洁阶段,将第二个目标置于清洁后阶段。所以第二个目标将在第一个目标之后运行。但是对于第三个目标,这个技巧将不起作用,因为第三个目标应该只在第一个目标之后运行(我不希望在第三次运行时运行第二个目标)。

无论如何,这个技巧是行不通的,因为我的 build.xml 是一个有很多目标的大文件,它们之间的关系很复杂。

有没有办法解决这个问题?maven 中是否有任何东西使一项任务依赖于另一项任务?

4

1 回答 1

1

a) 为什么不把它们放在一起?当您使用 maven 运行 ant 时,无论如何都不能调用单个目标,而是将 ant run 绑定到 maven 阶段。因此,您可以在 clean 阶段执行以下操作:

  <plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.4</version>
    <executions>
      <execution>
        <phase>clean</phase>
        <configuration>
          <tasks>
             <delete file="${dir.dist}/${api.jarfile}" />
             <delete dir="${dir.build}/**" />
             <mkdir dir="${dir.build}" />
             <mkdir dir="${dir.generated.code.junit}/build" />
             <mkdir dir="${dir.dist}" />
             <mkdir dir="${dir.deploy}" />
             <mkdir dir="${dir.dist}" />
          </tasks>
        </configuration>
        <goals>
          <goal>run</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

如果您需要在其他阶段进行更多工作,请添加更多执行:

      </execution> <!-- end tag from above -->
      <execution>
        <phase>generate-sources</phase>
        <configuration>
          <tasks>
               <!-- some more ant tasks -->
          </tasks>
        </configuration>
        <goals>
          <goal>run</goal>
        </goals>
      </execution>

b) 如果你使用 maven,你应该像 maven 一样思考。您在 ant 任务中所做的很多事情都是默认的 maven 行为。

在 clean 阶段,执行clean:clean目标,删除目标目录(以及随之而来的 jar)。如果你把你正在使用的所有目录放在目标下面(这在 maven 中被认为是很好的做法),maven 将自动删除它们(并创建它们)。

Maven 是关于约定的:

  • 生成的任何东西都进入目标
  • 主要工件的类和资源进入目标/类
  • 用于测试的类和资源进入目标/测试类
  • 生成的资源进入 target/generated-resources/yourfoldername
  • 生成的源进入 target/generated-sources/yourfoldername

所有主要插件都希望您遵循这些约定(根据它们有默认值),并且使用它们将使 maven 的生活变得更加轻松。

例如mvn clean,将确保您删除生成的所有内容。有一些例外,插件必须将数据存储在不同的位置,因此无法被 clean:clean 拾取。这些插件通常提供替代的 clean mojos(eclipse:cleanidea:clean是示例),但尽量不要创建更多异常。

此外,根据 maven 约定,不应该在 Phase clean 中创建任何内容。有很多阶段可以生成东西,比如generate-resources, generate-sources, generate-test-resources, generate-test-sources。另外:创建文件夹通常是不必要的,我知道的所有 maven 插件在编写文件时都会根据需要创建文件夹。

于 2010-07-30T08:49:56.170 回答