将ant资源生成目标集成到Maven构建中

时间:2011-06-01 11:46:28

标签: maven ant maven-antrun-plugin

我目前正在开发一个从Ant迁移到Maven的相当大的项目。实际的构建过程没有问题(它编译和打包源代码很好)。

问题在于我还有很多为项目生成额外资源的目标(编译LessCSS,生成和上传文档,为自定义标记和函数生成tld文件等)。我不确定我应该如何处理这些任务。让我们以构建CSS& JS的目标为例(其他人或多或少相似,但没有连接)。它看起来像这样(简化):

<target name="build.css_js">
    <concat destfile="${webapp.dir}/scripts/main.js">
        <fileset dir="${webapp.dir}/scripts/src" includes="*.js"/>
    </concat>

    <!-- build css files from less sources -->
    <taskdef name="lesscss" classname="com.asual.lesscss.LessEngineTask" classpathref="libraries" />
    <lesscss input="${webapp.dir}/syles/src/input.less" output="${webapp.dir}/styles/output.css" />
</target>

pom.xml我设置了以下插件:

<plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
        <execution>
            <phase>generate-resources</phase>
            <configuration>
               <tasks>
                   <echo message="Hello World from pom.xml"/>
                   <ant target="build.css_js"/>
               </tasks>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>

我正在使用的依赖项不再在我们的SVN存储库中(因为它们由Maven管理),所以我将库变量切换为指向Maven存储库:

<property name="lib.dir" location="${env.HOMEPATH}/.m2/repository" />

这不好,因为该路径可能仅在我的机器上有效。我不知道从Maven存储库引用库的任何其他方法,我需要它们来运行ant目标。

  • 我的方法是否正常或是否有更好的做事方式?
  • 如何克服图书馆问题?
  • 打包项目时需要一些资源,但有些则不需要。 生命周期阶段是否超出了编译/包的范围?我发现了site生命周期,我认为这符合我的需求。
  • 理想情况下,我应该完全放弃ant构建文件,但我不确定将脚本作为maven插件运行是否值得(我目前不知道该怎么做)。你觉得这个怎么样?

我是Maven的新手所以感谢任何建议。

1 个答案:

答案 0 :(得分:1)

通常嵌入antrun调用并不理想,但如果您没有找到合适的插件来执行您需要的操作,那么我不会担心它。如果处理相当简单,实际上很容易将它自己嵌入到Maven插件中,请参阅this example以获取入门帮助。

如果您要使用antrun,并且依赖关系jar已经安装到您的Maven存储库,您可以将antrun插件配置为在执行时使用这些jar作为插件配置的依赖项。这意味着依赖关系将被解析并可供使用,但对您的项目不可见(有助于避免意外包含)。然后以便携方式访问它们,您可以使用:

<property name="lib.dir" location="${settings.localRepository}" />

或者,您可以使用一些其他可用属性将Maven类路径公开给antrun插件,例如${maven.compile.classpath}有关详细信息,请参阅antrun documentation

如果您有多个针对ant的离散执行,您可以在antrun插件中单独配置它们,并为每个执行指定合适的id。下面的示例显示了两个执行,都绑定到流程资源阶段。当然,你需要提供一些实际目标。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-antrun-plugin</artifactId>
  <executions>
    <execution>
      <id>build-css</id>
      <phase>generate-resource</phase>
      <configuration>
        <target>
          ...
        </target>
      </configuration>
      <goals>
        <goal>run</goal>
      </goals>
    </execution>
    <execution>
      <id>build-js</id>
      <phase>generate-resource</phase>
      <configuration>
        <target>
          ...
        </target>
      </configuration>
      <goals>
        <goal>run</goal>
      </goals>
    </execution>
  </executions>
  <dependencies>
    <dependency>
      <groupId>some.group.id</groupId>
      <artifactId>artifactId</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>another.group.id</groupId>
      <artifactId>anotherId</artifactId>
      <version>1.0.1</version>
    </dependency>
  </dependencies>