如何避免复制与Ivy的依赖关系

我正在寻找使用常春藤来pipe理依赖关系,但哇 – 那东西真的很喜欢做多个jar子的副本! 它像我后院里的常春藤蔓延一样,是不受欢迎的!

是否有可能让常春藤简单地定义一个引用已parsing的依赖关系的类path(对于指定的configuration文件),以便我的javac可以直接在常青藤库(或caching?)中引用它们。

我已阅读参考文档购买只看到选项设置符号链接到存储库caching。 我想这样就足够了,但这似乎是一种浪费。 另外,我不确定一个“战争”的任务可以通过象征性的联系来build立战争……但是我想我会试试看。

有更好的build议吗?

这是我的标准的Java构build文件,创build一个可执行的jar

目标是通过ANT属性和ivy.xml文件的组合来pipe理项目特定的东西,用于第三方依赖项。

 <project xmlns:ivy="antlib:org.apache.ivy.ant" name="demo" default="build"> <property name="src.dir" location="src"/> <property name="build.dir" location="build"/> <property name="dist.dir" location="dist"/> <property name="dist.jar" location="${dist.dir}/${ant.project.name}.jar"/> <property name="dist.main.class" value="HelloWorld"/> <target name="retrieve"> <ivy:resolve/> <ivy:cachepath pathid="build.path" conf="build"/> <ivy:cachepath pathid="runtime.path" conf="runtime"/> </target> <target name="compile" depends="retrieve"> <mkdir dir="${build.dir}/classes"/> <javac srcdir="${src.dir}" destdir="${build.dir}/classes" classpathref="build.path"/> </target> <target name="build" depends="compile"> <ivy:retrieve pattern="${dist.dir}/lib/[artifact].[ext]"/> <manifestclasspath property="jar.classpath" jarfile="${dist.jar}"> <classpath> <fileset dir="${dist.dir}/lib" includes="*.jar"/> </classpath> </manifestclasspath> <jar destfile="${dist.jar}" basedir="${build.dir}/classes"> <manifest> <attribute name="Main-Class" value="${dist.main.class}"/> <attribute name="Class-Path" value="${jar.classpath}"/> </manifest> </jar> </target> <target name="clean"> <delete dir="${build.dir}"/> <delete dir="${dist.dir}"/> </target> </project> 

正如您在Ivy文件中发现的那样, cachepath常青藤任务用于pipe理两条ANTpath。 一个用于构build依赖关系,另一个用于可执行jar的运行时依赖关系。

常春藤的真正威力在于所谓的configurations 。 我发现很难掌握,直到我意识到这是一个简单的逻辑分组,我可以为我的项目定义。 这个例子有两个configurations

  • build
  • runtime

以下是常青藤文件,演示如何将依赖关系与configurations关联起来:

 <ivy-module version="2.0"> <info organisation="com.myspotontheweb" module="demo"/> <configurations> <conf name="build" description="Libraries needed to for compilation"/> <conf name="runtime" extends="build" description="Libraries that need to be included with project jar" /> </configurations> <dependencies> <dependency org="commons-lang" name="commons-lang" rev="2.0" conf="build->default"/> <dependency org="commons-cli" name="commons-cli" rev="1.0" conf="runtime->default"/> </dependencies> </ivy-module> 

总之,我希望这个例子有助于理解常春藤。 我喜欢它只专注于第三方依赖项的pipe理。

在通过写得不好的常春藤文档(叹息 – 这些人有什么错误?),他们没有参加任何语言的高中识字class?),我看到有一个解决后的任务,称为cachingpath ,将构build一个ant指向已parsing的依赖项构件的path,而不是将文件复制到lib目录。 这可能就是我正在寻找的!

只是为了增加@马克的答案。

请注意, cachepath结果也可以直接用于构build,而不需要复制带有retrievejar子:

 <target name="build" depends="compile"> <jar destfile="${dist.ear}"> <mappedresources> <resources refid="runtime.path"/> <chainedmapper> <flattenmapper/> <globmapper from="*" to="lib/*"/> </chainedmapper> </mappedresources> </jar> </target>