【发布时间】:2010-10-16 16:42:16
【问题描述】:
是否有包装 maven 的 ant 插件,以便我可以利用它的依赖项管理功能为我下载 jar 并将它们放在我的 ant 构建的 lib 文件夹中?
我的具体问题是我正在为 Hudson 使用 Crap4j 插件,但它目前还不支持 Maven。由于是一个小项目,maven 是矫枉过正,但如果我不需要,我不想没有mvn dependency:copy-dependcies。
有什么建议吗? (除了吸它)
【问题讨论】:
是否有包装 maven 的 ant 插件,以便我可以利用它的依赖项管理功能为我下载 jar 并将它们放在我的 ant 构建的 lib 文件夹中?
我的具体问题是我正在为 Hudson 使用 Crap4j 插件,但它目前还不支持 Maven。由于是一个小项目,maven 是矫枉过正,但如果我不需要,我不想没有mvn dependency:copy-dependcies。
有什么建议吗? (除了吸它)
【问题讨论】:
有一组使用 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)
【讨论】:
虽然水星任务有效,但我没有使用它们。我与他们的前辈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 在您的项目中太过分了,您可以/应该尝试Apache Ivy:这是一个非常强大的依赖管理库,类似于 Maven。
如果您在网络上托管项目,还请查看Ivy Roundup,它是各种库的 Ivy 定义存储库。
【讨论】:
只需使用Maven Ant Tasks。可以在normal maven download page下载。
【讨论】:
请参考:Why you should use the Maven Ant Tasks instead of Maven or Ivy
由于上面链接中给出的原因,我不会真的推荐 Ivy。
【讨论】:
从 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 目标...
享受....
【讨论】:
在我的情况下,我只想在存储库中放置一个 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>
【讨论】:
下载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>
【讨论】:
我现在正在解决同样的问题。我在本地 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>
【讨论】: