Jar 如何避免使用Ivy复制依赖项
我正在考虑使用常春藤来管理依赖关系,但是哇,这东西真的很喜欢制作多个JAR副本!它像我后院的常春藤一样蔓延,同样不受欢迎 有没有可能让Ivy简单地定义一个类路径(对于指定的概要文件)来引用已解析的依赖项,这样我的javac就可以直接在Ivy存储库(或缓存)中引用它们 我已经阅读了参考文档buy only,看到了设置到存储库缓存的符号链接的选项。我想这就足够了,但这似乎是浪费。此外,我不确定“战争”任务是否可以从符号链接构建战争。。。但我想我试一下就会发现Jar 如何避免使用Ivy复制依赖项,jar,dependencies,ivy,Jar,Dependencies,Ivy,我正在考虑使用常春藤来管理依赖关系,但是哇,这东西真的很喜欢制作多个JAR副本!它像我后院的常春藤一样蔓延,同样不受欢迎 有没有可能让Ivy简单地定义一个类路径(对于指定的概要文件)来引用已解析的依赖项,这样我的javac就可以直接在Ivy存储库(或缓存)中引用它们 我已经阅读了参考文档buy only,看到了设置到存储库缓存的符号链接的选项。我想这就足够了,但这似乎是浪费。此外,我不确定“战争”任务是否可以从符号链接构建战争。。。但我想我试一下就会发现 还有更好的建议吗 在阅读了写得很糟糕的常
还有更好的建议吗 在阅读了写得很糟糕的常春藤文献后(叹气-这些人怎么了?-他们没有参加任何语言的高中识字课吗?),我看到有一个名为cachepath的后期解析任务,它将构造一个到已解析依赖项工件的ant路径,而不是将文件复制到lib目录。这可能正是我要找的 这是我的标准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>
总之,我希望这个例子有助于理解常春藤。我喜欢它只专注于一件事的方式,即第三方依赖关系的管理。只是为了补充@Mark的答案
<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
result也可以直接在构建中使用,而无需使用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>
我放弃!常春藤的文档太糟糕了,以至于整个框架都毫无用处。我将不得不编写自己的依赖关系管理构建配置。作为解决方案并为ivy创建更好的文档不是更好吗?这似乎比一个完整的dep管理系统更需要维护,这个管理系统更详细、更完善。谢谢,这很有帮助。请注意,可能需要使用type=“jar”
限制cachepath
,并且缓存路径也可以直接用于打包:@Vadzim我从未见过限制配置的需要。通常,配置映射(到远程“默认”配置)可以很好地确保只包含jar工件。我以前是这样做的,首先使用常春藤检索任务创建临时临时暂存目录,以便生成WAR或EAR文件。@马克,请与我分享一些想法好吗?我看到了,但不知道如何从常春藤配置中轻松减去依赖项。