【问题标题】:Converting Ant to Maven: problem with target attribute "depends" on Ant将 Ant 转换为 Maven:目标属性“取决于”Ant 的问题
【发布时间】:2011-03-22 19:35:52
【问题描述】:

我正在将 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 中有什么东西可以让一个任务依赖于另一个任务吗?

【问题讨论】:

    标签: ant maven-2 maven-antrun-plugin


    【解决方案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 目标被执行,这会删除目标目录(以及随之而来的 jar)。如果你把你正在使用的所有目录放在 target 下(这在 maven 中被认为是好的做法),maven 会自动删除它们(并创建它们)。

    Maven 是关于约定的:

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

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

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

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

    【讨论】:

    • 谢谢seanizer。它对我有帮助。
    猜你喜欢
    • 2023-04-05
    • 2011-05-01
    • 2016-02-17
    • 2011-03-20
    • 1970-01-01
    • 2011-11-22
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多