【问题标题】:Setting up Ant / Ivy设置 Ant / Ivy
【发布时间】:2012-09-04 15:30:29
【问题描述】:

所以,假设我已经安装了 SVN 并在本地安装了 ANT / Ivy。

我想让常春藤配置的“共享”部分指向服务器上的某种共享。我需要如何设置?

我知道我必须挖掘 ivy jar 并提取 ivysettings 文件并修改共享存储库。

因此,假设我的 Intranet 上的服务器位于 MyServer.intranet.net,并且我团队的文件夹位于 /path/to/NetAdmin 下(因此完整路径为 MyServer.intranet.net/path/to/NetAdmin ) 如何将此设置为共享库的团队存储库?我是否只需指定它,当我打包项目时,它会在那里写入依赖项?

谢谢

【问题讨论】:

    标签: ant ivy


    【解决方案1】:

    我做了什么:

    • 我创建了一个名为 ivy.dir 的 Subversion 项目。
    • 在这个ivy.dir 项目中,我有最新的ivy.jar。
    • ivy.dir 中,我为我们的环境设置了ivysettings.xml。例如,我们为自己的 jars 使用本地 Artifactory Maven 存储库。 ivy.dir 项目中的 ivysettings.xml 指向这一点。
    • 我创建了一个名为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 中
      • 将 Ivy 命名空间定义添加到 build.xml&lt;project&gt; 定义中。
      • 将属性ivy.dir 设置为`${basedir}/ivy.dir。
      • 使用&lt;import&gt; 任务将${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 等的 Ivy 缓存。每个执行程序都可以删除自己的 Ivy 缓存,而不会影响其他人。同时,用户只有$HOME/.ivy2/cache-0
    • 您还可以在新罐子出现时更新 Ivy。你更新了你的 Ivy jar 文件,每个人都得到了迟到的结果。
    • 当然,Ivy 会在项目签出时自行安装。
    • 还有一个额外的特别奖励:您可以使用您的ivy.dirivy.tasks.xml 文件来安装其他任务。例如,我们的每个项目都必须通过FindbugsPMD、CPD(PMD 项目的一部分,Checkstyle,并使用JaCoCo. 进行测试覆盖。

    每个项目都包含一个 jar 文件和一个 &lt;taskdef&gt;,用于将任务定义拉入 Ant。而且,您也如何使用这些任务?它们没有在标准 Ant 模型中定义。开发人员不知道如何使用它们。

    我已将这些 jar 添加到我的 ivy.dir 项目中,并将所有这些任务定义安装到我的 ivy.tasks.xml 文件中。我还为大多数这些任务定义了易于使用的&lt;macrodef&gt;,因此开发人员很容易使用它们。事实上,我什至包含了旧的 Ant-Contrib 任务只是为了好玩。

    现在,一旦您将ivy.dir 添加到您的项目中,您就有了所有这些额外的任务,并且您无需在计算机上安装任何东西。

    【讨论】:

    • 大卫,您能否提供一些资源,以便我可以镜像此设置?据我所知,我们只是在运行 svn,而不是 Svn:external,我的团队正在寻找我来设置一些东西,这听起来像是处理(并超过了)我们当前的所有问题。谢谢
    【解决方案2】:

    您无需更改常春藤罐。只需在 ivysettings 文件中创建文件系统解析器并发布到此文件。这是一个例子:

    您会发现 ivy 非常灵活,几乎可以支持任何托管文件的机制。

    就个人而言,我会考虑安装一个 Maven 存储库管理器,例如 NexusArtifactory,并使用它来托管您的构建依赖项和构建输出。从长远来看,这会容易得多,尤其是在您进行 Java 开发时。

    【讨论】:

      猜你喜欢
      • 2011-06-23
      • 2020-09-04
      • 2011-05-17
      • 2012-11-09
      • 2011-01-27
      • 2012-09-06
      • 2012-09-04
      • 2012-07-02
      • 2018-02-24
      相关资源
      最近更新 更多