这是我所做的:
- 我创建了一个名为
ivy.dir
.
- 在这个
ivy.dir
项目中,我有最新的 ivy.jar。
- 在 中
ivy.dir
,我有ivysettings.xml
我们环境的设置。例如,我们为自己的 jars 使用本地 Artifactory Maven 存储库。项目ivysettings.xml
中的ivy.dir
指出了这一点。
- 我创建了一个名为
ivy.tasks.xml
. 这是一个 Ant 构建文件。
ivy.tasks.xml
看起来像这样:
<project name="Ivy.Tasks"
xmlns:ivy="http://ant.apache.org/ivy"
xmlns:jacoco="antlib:org.jacoco.ant">
<property environment="env"/>
<!-- Add Ivy Tasks -->
<taskdef uri="http://ant.apache.org/ivy"
resource="org/apache/ivy/ant/antlib.xml">
<classpath>
<fileset dir="${ivy.dir}">
<include name="ivy*.jar"/>
</fileset>
</classpath>
</taskdef>
<ivy:settings file="${ivy.dir}/ivysettings.xml"/>
</project>
请注意,我有自己的 Ivy 设置,谢谢。我没有必要修改其中的那个ivy.jar
(尽管我可以这样做,因为每个人都会使用我的ivy.jar
文件!)。我的ivysettings.xml
样子是这样的:
<ivysettings>
<!-- I'll explain this part below -->
<property name="env.EXECUTOR_NUMBER" value="0" override="false"/>
<caches
defaultCacheDir="${ivy.default.ivy.user.dir}/cache-${env.EXECUTOR_NUMBER}"
resolutionCacheDir="${ivy.dir}/../target/ivy.cache"/>
<!-- Just the standard stuff you find in the `ivysettings.xml in the ivy.jar -->
<settings defaultResolver="default"/>
<include file="${ivy.dir}/ivysettings-public.xml"/> <!-- This one is different -->
<include url="${ivy.default.settings.dir}/ivysettings-shared.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-local.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-main-chain.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-default-chain.xml"/>
</ivysettings>
最大的变化是ivysetting-public.xml
文件:
<ivysettings>
<resolvers>
<ibiblio name="public"
m2compatible="true"
checkmodified="true"
root="http://repos.vegicorp.com/artifactory/libs-release" />
</resolvers>
</ivysettings>
它指向我的本地 Maven 存储库——我的 Artifactory 服务器。
现在,对于使用 Ivy 的开发人员,他们所要做的就是:
- 在 Subversion 项目的根目录中,添加一个
svn:external
. 这svn:external
将用于将我的ivy.dir
项目带入他们的 Subversion 项目。
- 在 build.xml
build.xml
在定义中为它们添加一个 Ivy 命名空间<project>
定义。
- 将属性设置
ivy.dir
为`${basedir}/ivy.dir。
- 使用
<import>
任务导入${ivy.dir}/ivy.tasks.xml
他们的build.xml
文件。
像这样的东西:
<project name="post-a-matic" default="package" basedir="."
xmlns:ivy="http://ant.apache.org/ivy">
<property name="ivy.dir" value="${basedir}/ivy.dir"/>
<import file="${ivy.dir}/ivy.tasks.xml"/>
<!-- A whole bundle of properties are set -->
<target name="clean">
<delete dir="${target.dir}"/>
<ivy:cleancache/> <!-- Look: They have access to Ivy! -->
</target>
<target name="-resolve">
<ivy:resolve/>
</target>
<target name="compile"
depends="-resolve">
<ivy:cachpath
pathid="main.classpath"
conf="compile,provided"/>
<!-- Boy that's easy! -->
<javac srcdir="${main.srcdir}"
destdir="${main.destdir}"
classpathref="main.classpath"/>
</target>
<!-- On and on -->
这解决了很多问题:
- 您可以更新
ivy.settings
并且每个人都将拥有更新的设置。这最终对我们非常重要,因为我们使用 Jenkins,我希望 Jenkins 清理每个构建的 ivy 缓存。哎呀!这会清除同时执行的构建中的常春藤缓存!我通过更改ivysettings.xml
文件为每个 Jenkins 构建执行程序定义不同的 Ivy 缓存解决了这个问题。在 Jenkins 服务器中,您有名为$HOME/.ivy2/cache-0
,$HOME/.ivy2/cache-1
等的常春藤缓存。每个执行程序都可以删除它自己的常春藤缓存,而不会影响其他人。同时,用户将只有$HOME/.ivy2/cache-0
.
- 您还可以在新罐子出来时更新 Ivy。你更新了你的 Ivy jar 文件,每个人都得到了迟到的东西。
- 最重要的当然是 Ivy 会在项目签出时自行安装。
- 还有一个额外的特殊奖励:您可以使用您的
ivy.dir
和ivy.tasks.xml
文件来安装其他任务。例如,我们的每个项目都必须通过Findbugs、 PMD、 CPD (PMD 项目的一部分Checkstyle )运行自己,并使用JaCoCo进行测试覆盖。
这些项目中的每一个都包含一个 jar 文件和一个<taskdef>
用于将任务定义拉入 Ant 的文件。而且,您也如何使用这些任务?它们没有在标准 Ant 模型中定义。开发人员不知道如何使用它们。
我已将这些 jar 添加到我的ivy.dir
项目中,并将所有这些任务定义安装到我的ivy.tasks.xml
文件中。我还为大多数这些任务定义了易于使用<macrodef>
,因此开发人员很容易使用它们。事实上,我什至包含了旧的 Ant-Contrib 任务只是为了好玩。
现在,一旦你添加ivy.dir
到你的项目中,你就拥有了所有这些额外的任务,并且你没有任何东西可以安装在你的机器上。