【问题标题】:Using Maven from Ant使用 Ant 的 Maven
【发布时间】:2010-10-16 16:42:16
【问题描述】:

是否有包装 maven 的 ant 插件,以便我可以利用它的依赖项管理功能为我下载 jar 并将它们放在我的 ant 构建的 lib 文件夹中?

我的具体问题是我正在为 Hudson 使用 Crap4j 插件,但它目前还不支持 Maven。由于是一个小项目,maven 是矫枉过正,但如果我不需要,我不想没有mvn dependency:copy-dependcies

有什么建议吗? (除了吸它)

【问题讨论】:

    标签: maven-2 ant


    【解决方案1】:

    有一组使用 Mercury 的新 Ant 任务。 Mercury 是重构的代码,它将成为 Maven 3 与 Oleg Gusakov 正在实现的 Maven(和 OSGi)存储库交互方式的基础。 Mercury 已经过很好的测试,您现在可以在 Ant 项目中开始使用它。看看 Oleg 编写的一些 How-to 文档:

    http://people.apache.org/~ogusakov/sites/mercury-ant/mercury-ant-tasks/howto.html

    这是一个在 Ant build.xml 文件中使用 Mercury 的简单示例。以下构建文件创建了一个依赖于 asm 工件的 3.0 版本的类路径:

    <javac srcdir="src/main/java"
           destdir="target/classes">
      <classpath> 
        <deps>
          <dependency name="asm:asm:3.0"/>
        </deps>
      </classpath>
    </javac>
    

    有许多高级功能,例如支持验证 PGP 签名或 MD5 摘要。您还可以开始定义 Mercury 所依赖的不同存储库。除了使用本地目录作为存储库之外,此 XML 还允许您定义对存储库的引用,例如 Nexus

    <repo id="myCentral" 
     url="http://localhost:8081/nexus/contengs/groups/public"/>
    <repository dir="/my/local/repo"/>
    
    <javac srcdir="src/main/java"
           destdir="target/classes">
      <classpath> 
        <deps>
          <dependency name="asm:asm:3.0"/>
        </deps>
      </classpath>
    </javac>
    

    如果您需要引用需要身份验证的存储库,Mercury 支持存储用户名和密码:

    <repo id="myCentral" 
     url="http://localhost:8081/nexus/contengs/groups/public">
      <auth name="foo" pass="bar"/>
    </repo>
    
    <javac srcdir="src/main/java"
           destdir="target/classes">
      <classpath> 
        <deps>
          <dependency name="asm:asm:3.0"/>
        </deps>
      </classpath>
    </javac>
    

    最引人注目的是能够将工件从 Ant 构建文件发布到存储库。如果您在任何规模的组织中工作,您将开始考虑将工件部署到像 Nexus 这样的存储库管理器。使用 Mercury,您可以开始将工件部署到存储库管理器,而无需采用 Maven。这是一个构建文件,它定义了一个经过身份验证的存储库并编写了一个工件:

    <repo id="myCentral" 
     url="http://localhost:8081/nexus/contengs/groups/public">
      <auth name="foo" pass="bar"/>
    </repo>
    
    <write repoid="myCentral"
           name="t:t:1.0"
           file="${basedir}/target/t.jar"/>
    

    Mercury 已准备就绪,您可以期待 Oleg 未来的许多发展。如果你想开始使用它,最好的地方是Oleg's How-to Page。 (注:此信息将很快整合到Definitive Guide

    【讨论】:

    • 直到今天它还没有更新,版本是 alpha 1 的快照。
    • 这没关系,但我不认为你不能执行 mvn clean install。
    【解决方案2】:

    虽然水星任务有效,但我没有使用它们。我与他们的前辈maven-ant-tasks 取得了很好的成功。如果您手头已经有 POM,那么它们很容易上手。

    <project name="blah" xmlns:artifact="antlib:org.apache.maven.artifact.ant">
      <!-- If you drop the maven-ant-tasks in ~/.ant/lib, you don't need these two bits. -->
      <taskdef uri="antlib:org.apache.maven.artifact.ant"
               resource="org/apache/maven/artifact/ant/antlib.xml"
               classpathref="ant.classpath" />
      <path id="ant.classpath">
        <fileset dir="${ant.tasks.dir}">
          <include name="*.jar" />
        </fileset>
      </path>
      <target name="resolve" description="--> retrieve dependencies with maven">
          <!-- Resolve dependencies -->
          <artifact:dependencies filesetId="dependency.fileset">
              <pom file="pom.xml" />
          </artifact:dependencies>
          <!-- Copy all dependencies to the correct location. -->
          <copy todir="${web.dir}/WEB-INF/lib">
              <fileset refid="dependency.fileset" />
              <!-- This mapper strips off all leading directory information -->
              <mapper type="flatten" />
          </copy>
      </target>
    </project>
    

    我喜欢将我的 ant 任务 jar 保存在项目中,所以我添加了 taskdef 和路径。但是如果你想把maven-ant-tasks-2.0.9.jar 放在~/.ant/lib 中,那么你就不需要声明这些东西了。我想。

    【讨论】:

    • 您对 maven-ant-task.jar 文件的放置是正确的。如果您在项目中而不是在您的 ant 的 lib 文件夹中,则只需要这两行。这就是我曾经解决问题的方式,stackoverflow.com/a/32950670/1793718
    【解决方案3】:

    如果您认为 Maven 在您的项目中太过分了,您可以/应该尝试Apache Ivy:这是一个非常强大的依赖管理库,类似于 Maven。

    如果您在网络上托管项目,还请查看Ivy Roundup,它是各种库的 Ivy 定义存储库。

    【讨论】:

    • 经过一些来之不易的配置后,我得到了这个运行就像一个魅力。非常感谢。
    【解决方案4】:

    只需使用Maven Ant Tasks。可以在normal maven download page下载。

    【讨论】:

    • +1 - 现在是 2012 年,maven-ant-tasks 是我发现通过 ant 使用依赖管理的最佳方式。几年前我认真地尝试使用 ivy,但最终放弃了它,只是将 maven-ant-tasks 用于 ant-only 项目,并尽可能使用 maven。 Ivy (曾经) 只是基本 maven 理念的重新实现,没有其他好处,除了一个不同的名称(这对许多人来说已经足够卖点了)。然而,今天,更多的项目只是(是的,简单地)使用 maven,并且只在极端情况下(imo)使用 ant。如果代码将被(重新)使用,请尽快对项目进行 mavenize。
    【解决方案5】:

    请参考:Why you should use the Maven Ant Tasks instead of Maven or Ivy

    由于上面链接中给出的原因,我不会真的推荐 Ivy。

    【讨论】:

    • 反对常春藤的论点是虚假的。如果你真的想使用 Maven,那么一定不要使用 Ivy。说 Maven 比 Ivy 好,因为 Ivy 不像 Maven 很有趣。我敢肯定没有人会买账。
    【解决方案6】:

    从 Ant 运行 Maven 目标非常简单

    <target name="buildProject" description="Builds the individual project">
        <exec dir="${source.dir}\${projectName}" executable="cmd">
            <arg value="/c"/>
            <arg value="${env.MAVEN_HOME}\bin\mvn.bat"/>
            <arg line="clean install" />
        </exec>
    </target>
    

    使用它,您可以从 Ant 运行任何类型的 Maven 目标...

    享受....

    【讨论】:

    • 它不是跨平台的,Maven Ant 任务更适合这个目的。
    • @dhawal 我试过这个,但我得到 [exec] 系统找不到指定的路径。 [执行] 结果:1
    【解决方案7】:

    在我的情况下,我只想在存储库中放置一个 ejb jar,这样我就可以在另一个以 maven 作为依赖项的项目中使用它:

    <target name="runMaven" depends="deploy" description="LLama al maven.">
        <exec executable="cmd">
            <arg value="/c"/>
            <arg value="mvn.bat install:install-file -DgroupId=com.advance.fisa.prototipo.camel -DartifactId=batch-process -Dversion=1.0 -Dpackaging=jar  -Dfile=${jarDirectory}\batch-process.jar"/>
        </exec>
    </target>
    

    【讨论】:

      【解决方案8】:

      下载Maven Ant Tasks然后使用这个:

      <target name="getDependencies">
              <path id="maven-ant-tasks.classpath" path="${basedir}${file.separator}maven${file.separator}lib${file.separator}maven-ant-tasks.jar" />
              <typedef resource="org/apache/maven/artifact/ant/antlib.xml" uri="antlib:org.apache.maven.artifact.ant" classpathref="maven-ant-tasks.classpath" />
      
              <artifact:dependencies filesetId="dependency.fileset" type="jar">
                  <pom file="pom.xml" />
              </artifact:dependencies>
      
              <!--TODO take care of existing duplicates in the case of changed/upgraded dependencies-->
              <copy todir="lib">
                  <fileset refid="dependency.fileset" />
                  <mapper type="flatten" from="${dependency.versions}" />
              </copy>
          </target>
      

      【讨论】:

        【解决方案9】:

        我现在正在解决同样的问题。我在本地 Maven 存储库中安装了所有必要的库,然后将其放入我们的公司 Maven 存储库中。 它还不能很好地工作。一些测试失败,在我的 Maven 测试运行中运行良好,但由于测试结果对覆盖数据并不重要,我很满意。

        这是我的Mavensn-p。我希望这会有所帮助。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>1.1</version>
            <inherited>false</inherited>
            <executions>
                <execution>
                    <phase>site</phase>
                    <configuration>
                        <tasks>
                            <property name="compile_classpath" refid="maven.compile.classpath"/>
                            <property name="runtime_classpath" refid="maven.runtime.classpath"/>
                            <property name="test_classpath" refid="maven.test.classpath"/>
                            <property name="plugin_classpath" refid="maven.plugin.classpath"/>
                            <property name="CRAP4J_HOME" value="${user.home}/Projects/crap4j"/>
                            <taskdef name="crap4j" classname="org.crap4j.anttask.Crap4jAntTask">
                                <classpath>
                                    <fileset dir="${CRAP4J_HOME}/lib">
                                        <include name="**/*.jar"/>
                                    </fileset>
                                </classpath>
                            </taskdef>
                            <crap4j projectdir="${project.basedir}/alm-jar-server"
                                    outputDir="${project.basedir}/crap4jReports"
                                    dontTest="false"
                                    debug="true">
                                <classes>
                                    <pathElement location="${project.basedir}/target/classes"/>
                                </classes>
                                <srces>
                                    <pathElement location="${project.basedir}/src/main/java"/>
                                </srces>
                                <testClasses>
                                    <pathElement location="${project.basedir}/target/test-classes"/>
                                </testClasses>
                                <libClasspath>
                                    <fileset dir="${user.home}/.m2/repository">
                                        <include name="**/*.jar"/>
                                    </fileset>
                                </libClasspath>
                            </crap4j>
        
        
                           </tasks>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>org.crap4j</groupId>
                    <artifactId>crap4j</artifactId>
                    <version>1.1.6</version>
                </dependency>
                <dependency>
                    <groupId>org.kohsuke</groupId>
                    <artifactId>args4j</artifactId>
                    <version>2.0.1</version>
                </dependency>
                <dependency>
                    <groupId>com.agitar</groupId>
                    <artifactId>asmlib</artifactId>
                    <version>1.0</version>
                </dependency>
                <dependency>
                    <groupId>commons-httpclient</groupId>
                    <artifactId>commons-httpclient</artifactId>
                    <version>3.0</version>
                </dependency>
                <dependency>
                    <groupId>com.agitar</groupId>
                    <artifactId>coverage</artifactId>
                    <version>1.0</version>
                </dependency>
            </dependencies>
        </plugin>
        

        【讨论】:

          猜你喜欢
          • 2015-03-02
          • 1970-01-01
          • 1970-01-01
          • 2019-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-17
          • 2011-02-07
          相关资源
          最近更新 更多