我正在研究使用常春藤来管理依赖关系,但是哇 - 这件事真的很喜欢制作多个罐子的副本!它像我的后院常春藤一样蔓延,同样不受欢迎!
是否可以让Ivy简单地定义引用已解析依赖项的类路径(对于指定的配置文件),以便我的javac可以直接在ivy存储库(或缓存?)中引用它们。
我已阅读参考文档仅购买请参阅设置存储库缓存的符号链接的选项。我想这就足够了,但这似乎是浪费。此外,我不确定“战争”任务是否可以通过符号链接来构建战争......但我想我会在尝试时找到它。
有什么更好的建议吗?
答案 0 :(得分:14)
这是我的标准Java构建文件,它创建了一个可执行文件jar
。
目标是通过ANT属性和第三方依赖项的 ivy.xml
文件的组合来管理项目特定的内容。
<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>
正如您在常春藤文档中发现的那样, cachepath
常春藤任务用于管理两条ANT路径。一个用于构建依赖项,另一个用于可执行文件jar
的运行时依赖项。
常春藤的真正力量在于configurations
。我发现很难掌握,直到我意识到我可以为我的项目定义jar
的简单逻辑分组。此示例有两个configurations
:
build
runtime
这是ivy文件,演示了如何将依赖关系与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>
总之,我希望这个例子有助于理解常春藤。我喜欢它只专注于一件事的方式,即第三方依赖的管理。
答案 1 :(得分:3)
在与写得不好的常春藤文件作斗争之后(叹息 - 这些人有什么问题? - 他们没有参加任何语言的高中文化课吗?),我看到有一个名为的后解决任务cachepath ,它将构建已解析的依赖项工件的ant路径,而不是将文件复制到lib目录。这可能正是我正在寻找的东西!
答案 2 :(得分:3)
只是为了补充@Mark的答案。
请注意,cachepath
结果也可以直接在构建中使用,而无需使用retrieve
复制jar:
<target name="build" depends="compile">
<jar destfile="${dist.ear}">
<mappedresources>
<resources refid="runtime.path"/>
<chainedmapper>
<flattenmapper/>
<globmapper from="*" to="lib/*"/>
</chainedmapper>
</mappedresources>
</jar>
</target>