位于我的 dep lib 中的 ivy jar
ivy jar located in my dep lib
如何告诉 ant 在我自己的库中找到 Ivy 的 jar? ant 只是一直在查看它的主文件夹,即使我已经明确告诉它在其他地方找到 jar。
我建议从 ANT 主目录中删除 ivy jar。 (出于某些非常奇怪的原因,它通常不与 ANT 一起打包)。
相反,我建议包括一项特殊任务以确保安装了 ivy。
<available classname="org.apache.ivy.Main" property="ivy.installed"/>
<target name="install-ivy" description="Install ivy" unless="ivy.installed">
<mkdir dir="${user.home}/.ant/lib"/>
<get dest="${user.home}/.ant/lib/ivy.jar" src="http://search.maven.org/remotecontent?filepath=org/apache/ivy/ivy/2.4.0/ivy-2.4.0.jar"/>
<fail message="Ivy has been installed. Run the build again"/>
</target>
分析
ANT manual 概述了 ANT 在启动时加载 jar 的顺序。
- -lib jar 以命令行上的 -lib 元素指定的顺序排列
- 来自 ${user.home}/.ant/lib 的罐子(除非设置了 -nouserlib)
- 罐子来自 ANT_HOME/lib
这总是会发生,不幸的是,您在构建文件中做什么并不重要......
ANT_HOME/lib
中的罐子
在我看来,将 jars 放入 ANT_HOME 有效地创建了 ANT 的定制安装。它使您的项目在机器之间的可移植性降低,并且定制经常被遗忘和未记录。
因此,如果您可以控制构建服务器,我建议您删除在这里找到的所有 ANT 任务。
${user.home}/.ant/lib
中的罐子
由于以下原因,将罐子放在这里不那么令人反感
- 用户拥有的目录运行构建
- 可以通过使用命令行选项 -nouserlib
在 run-time 处忽略
- 我放在这里的唯一 jar 是 ivy...所有其他 jar 都存在于 ivy 缓存中(包括 ANT 任务)
您可以将 Ivy 二进制文件放在项目文件夹内的某个文件夹中。例如,在我的例子中,它是 etc/build/。我把 ivy.jar 和 jsch.jar.
放在哪里
之后在项目防御中提供正确的命名空间并加载 Ivy。
<project name="somename" basedir="." xmlns:ivy="antlib:org.apache.ivy.ant">
<target name="ivy-load">
<path id="ivy.lib.path">
<pathelement location="${basedir}/etc/build/ivy.jar"/>
<pathelement location="${basedir}/etc/build/jsch.jar"/>
</path>
<taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path"/>
</target>
<target name="ivy-init" depends="ivy-load">
<ivy:settings file="${basedir}/etc/ivysettings/ivysettings.xml"/>
<ivy:resolve conf="${ivy.conf}"/>
</target>
...
</project>
如何告诉 ant 在我自己的库中找到 Ivy 的 jar? ant 只是一直在查看它的主文件夹,即使我已经明确告诉它在其他地方找到 jar。
我建议从 ANT 主目录中删除 ivy jar。 (出于某些非常奇怪的原因,它通常不与 ANT 一起打包)。
相反,我建议包括一项特殊任务以确保安装了 ivy。
<available classname="org.apache.ivy.Main" property="ivy.installed"/>
<target name="install-ivy" description="Install ivy" unless="ivy.installed">
<mkdir dir="${user.home}/.ant/lib"/>
<get dest="${user.home}/.ant/lib/ivy.jar" src="http://search.maven.org/remotecontent?filepath=org/apache/ivy/ivy/2.4.0/ivy-2.4.0.jar"/>
<fail message="Ivy has been installed. Run the build again"/>
</target>
分析
ANT manual 概述了 ANT 在启动时加载 jar 的顺序。
- -lib jar 以命令行上的 -lib 元素指定的顺序排列
- 来自 ${user.home}/.ant/lib 的罐子(除非设置了 -nouserlib)
- 罐子来自 ANT_HOME/lib
这总是会发生,不幸的是,您在构建文件中做什么并不重要......
ANT_HOME/lib
中的罐子在我看来,将 jars 放入 ANT_HOME 有效地创建了 ANT 的定制安装。它使您的项目在机器之间的可移植性降低,并且定制经常被遗忘和未记录。
因此,如果您可以控制构建服务器,我建议您删除在这里找到的所有 ANT 任务。
${user.home}/.ant/lib
中的罐子由于以下原因,将罐子放在这里不那么令人反感
- 用户拥有的目录运行构建
- 可以通过使用命令行选项 -nouserlib 在 run-time 处忽略
- 我放在这里的唯一 jar 是 ivy...所有其他 jar 都存在于 ivy 缓存中(包括 ANT 任务)
您可以将 Ivy 二进制文件放在项目文件夹内的某个文件夹中。例如,在我的例子中,它是 etc/build/。我把 ivy.jar 和 jsch.jar.
放在哪里之后在项目防御中提供正确的命名空间并加载 Ivy。
<project name="somename" basedir="." xmlns:ivy="antlib:org.apache.ivy.ant">
<target name="ivy-load">
<path id="ivy.lib.path">
<pathelement location="${basedir}/etc/build/ivy.jar"/>
<pathelement location="${basedir}/etc/build/jsch.jar"/>
</path>
<taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path"/>
</target>
<target name="ivy-init" depends="ivy-load">
<ivy:settings file="${basedir}/etc/ivysettings/ivysettings.xml"/>
<ivy:resolve conf="${ivy.conf}"/>
</target>
...
</project>