2012-09-11 96 views
14

我目前有ANT_HOME位於/home/<myuser>/ant/1.8.4/ant-1.8.4。我剛剛下載了the Apache Ivy tarball that includes its dependencies。我將它提取到/home/<myuser>/ivy/2.3.0-rc1/ivy-2.3.0-rc1如何配置Ivy for Ant版本

然後我複製/home/<myuser>/ivy/2.3.0-rc1/ivy-2.3.0-rc1/lib/*.jarANT_HOME/lib。如果我理解Ant如何與插件/擴展一起工作是正確的,那麼Ant現在應該能夠在運行時訪問所有Ivy的任務。

我的下一個問題是,我如何在我的Ant構建文件中定義Ivy任務?假設我想使用ivy-retrieve,ivy-resolveivy-publish任務。當我從命令行運行我的Ant構建時(我不會通過Ant-Eclipse插件構建),我需要做的所有配置(在XML中)都可以使這些任務正常工作。提前致謝!

回答

56

首先,您必須定義<taskdef>以指向常春藤任務。

<property environment="env"/> 
<property name="ivy.home" value="${env_IVY_HOME}"/> 

<taskdef resource="org/apache/ivy/ant/antlib.xml"> 
    <classpath> 
     <fileset dir="${ivy.home}"> 
      <include name="*.jar"/> 
     </fileset> 
    </classpath> 
</taskdef> 

這將使您能夠訪問常春藤任務。你會使用這樣的任務:

<cachepath pathid="main.classpath" conf="compile"/> 

問題是你的常春藤任務名稱可能會與其他Ant任務衝突。例如,有一個常春藤任務<report>。爲了解決這個問題,你可以創建一個Ivy命名空間。要做到這一點,你把引用您的命名空間中<project>實體是這樣的:

<project name="my.proj" default="package" basedir="." 
    xmlns:ivy="antlib:org.apache.ivy.ant"/> 

現在,當你定義常春藤任務,您可以使用antlib:org.apache.ivy.ant參考您的ivy命名空間。同樣的taskdef和以前一樣,但有uri場:

<property environment="env"/> 
<property name="ivy.home" value="${env_IVY_HOME}"/> 

<taskdef resource="org/apache/ivy/ant/antlib.xml" 
    uri="antlib:org.apache.ivy.ant"> 
    <classpath> 
     <fileset dir="${ivy.home}"> 
      <include name="*.jar"/> 
     </fileset> 
    </classpath> 
</taskdef> 

順便說一句,沒有什麼特殊之處,uri。我可以這樣做:現在

<project name="my.proj" default="package" basename="." 
    xmlns:ivy="pastrami:with.mustard"> 

[...] 
<taskdef resource="org/apache/ivy/ant/antlib.xml" 
    uri="pastrami:with.mustard"> 
    <classpath> 
     <fileset dir="${ivy.home}"> 
      <include name="*.jar"/> 
     </fileset> 
    </classpath> 
</taskdef> 

的一點是,你可以用ivy:前綴你的任務名稱。取而代之的是:

<cachepath pathid="main.classpath" conf="compile"/> 

現在你可以這樣做:

<ivy:cachepath pathid="main.classpath" conf="compile"/> 

這就是你如何獲取你的常春藤Ant任務。現在

,您可以訪問您的常青藤Ant任務,你需要定義一個ivysettings.xml文件並使用<ivy:settings/>任務點有:

<ivy:settings file="${ivy.home}/ivysettings.xml"/> 

有嵌入常春藤默認ivysettings.xml文件,該文件將指向你到世界各地的Maven倉庫系統。如果你沒有一個公司範圍內的Maven倉庫,那麼你可以使用默認ivysettings.xml文件:

<ivy:settings/> 

這很簡單。

完成之後,您需要閱讀resolve文件,該文件通常位於項目的根目錄中,與您的build.xml文件位於同一目錄中。

基本上,您的ivy.xml文件包含對想要帶入項目的第三方jar的引用。例如:

<dependencies> 
    <dependency org="log4j" name="log4j" rev="1.2.17" conf="compile->default"/> 
    <dependency org="junit" name="junit" rev="4.10" conf="test->default"/> 
</dependencies> 

這是什麼意思是,我需要編譯(和太編譯測試)的log4j.jar(修訂1.2.17),我需要junit.jar(revision.4.10)爲我的測試代碼編譯。

compile->default是我compile配置Maven的default配置(說我只是想罐,它可能依賴於其他任何廣口瓶的映射。

在哪裏的呢我compile配置從何而來呢?我把它定義。在我ivy.xml有十個標準配置這也將進入你的ivy.xml文件:

<configurations> 
    <conf name="default" visibility="public" description="runtime dependencies and master artifact can be used with this conf" extends="runtime,master"/> 
    <conf name="master" visibility="public" description="contains only the artifact published by this module itself, with no transitive dependencies"/> 
    <conf name="compile" visibility="public" description="this is the default scope, used if none is specified. Compile dependencies are available in all classpaths."/> 
    <conf name="provided" visibility="public" description="this is much like compile, but indicates you expect the JDK or a container to provide it. It is only available on the compilation classpath, and is not transitive."/> 
    <conf name="runtime" visibility="public" description="this scope indicates that the dependency is not required for compilation, but is for execution. It is in the runtime and test classpaths, but not the compile classpath." extends="compile"/> 
    <conf name="test" visibility="private" description="this scope indicates that the dependency is not required for normal use of the application, and is only available for the test compilation and execution phases." extends="runtime"/> 
    <conf name="system" visibility="public" description="this scope is similar to provided except that you have to provide the JAR which contains it explicitly. The artifact is always available and is not looked up in a repository."/> 
    <conf name="sources" visibility="public" description="this configuration contains the source artifact of this module, if any."/> 
    <conf name="javadoc" visibility="public" description="this configuration contains the javadoc artifact of this module, if any."/> 
    <conf name="optional" visibility="public" description="contains all optional dependencies"> 
</configurations> 

你可以使用任何你想要的配置名稱,但這些映射到默認的Maven配置的d被廣泛使用。

一旦你有你ivy.xml文件中定義,你可以使用<ivy.resolve>解決您的依賴關係:

<ivy:resolve/> 

所以,我們有以下幾點:

  1. 如何使用<taskdef>build.xml將常青藤Ant任務合併到您的構建中。
  2. 如何使用Ivy Ant任務<ivy:settings>來配置Ivy。
  3. 如何使用<ivy:resolve/>來讀取您的ivy.xml文件並解決您的第三方jar依賴項。

現在,您可能想實際使用這些jar文件。有三種方法可以做到這一點:

<ivy:cachepath pathid="main.classpath" conf="compile"/> 

<ivy:cachepath/>任務將創建一個類路徑(在這種情況下,所謂的main.classpath)指向您在ivy.xml文件的compile配置有罐子。這在大部分時間被使用。

如果你需要一個文件集,您可以使用此:

<ivy:cachefileset setid="compile.fileset" conf="compile"/> 

在這種情況下,它會創建一個文件集與compile.fileset一個REFID。

有時你必須把罐子放進你的項目中。例如,如果你創建一個戰爭或耳朵文件,你想要附上你的罐子。在這種情況下,你可以使用這個:

<property name="lib.dir" value="${target.dir}/lib"/> 
<ivy:retrieve pattern="${lib.dir}/[artifact].[ext]" 
    conf="runtime"/> 

將在您的罐子取到${lib.dir}目錄,這樣你就可以將它們包括在戰爭或耳朵。

對不起,很長的回答,但有很多步驟來覆蓋。我強烈推薦Manning的書Ant in Action,其中有關於常春藤的全章。

+3

這是迄今爲止最全面的答案,任何常春藤相關的問題,我問過或已到來對,我希望我能更多地讚揚它。感謝您花時間幫助我,這非常完美。一個快速後續問題(如果我可以):我打算擁有自己的託管存儲庫,可能由Artifactory管理。每當我和Ivy一起工作時,我都看到我的同事們將'conf'屬性定義爲'conf =「* - > *」'或'conf = compile-> default',但似乎沒有人清楚理解這些做什麼,以及爲什麼...... – IAmYourFaja

+0

你提到它是本地Ivy配置('ivy.xml')和它解決的存儲庫之間的映射,而且你甚至足以顯示什麼是「編譯」配置可能看起來像(與'測試'配置)。但是在存儲庫端(「箭頭」運算符的右側)呢? 「'* - > *'」映射到什麼?那麼「default」呢?只是好奇,因爲無論我讀了多少次常春藤文檔,我似乎都無法將它包圍。再次感謝你的幫助! – IAmYourFaja

+0

常春藤沒有標準配置。你必須在你的'ivy.xml'文件中定義你的配置。我的帖子中提到的標準版本映射到Maven _scopes_。我可以在我的'ivy.xml'中定義一個配置,或者我可以添加上面沒有提到的配置。例如,有些人在'ivy.xml中爲axis2和WSDL文件添加了'generated-sources'配置。事情是你必須將你的配置映射到repos的配置。我從來沒有試過'* - > *'。我想它會將'ivy.xml'中的所有配置映射到所有存儲庫配置。我必須試一試。 –

12

David給出了非常好的答案,但我想指出taskdef不是必需的。 倘若ivy.jar是在預期位置在ANT文件的頂部空間聲明是不夠的:

<project ..... xmlns:ivy="antlib:org.apache.ivy.ant"> 

更多的細節我建議你閱讀有關如何ANT libs工作。

以下的答案提供了更多的一些「建立常青藤」的建議:

+1

最全面和最清晰的教程這是正確和簡單的答案,如果ivy.jar是在ant_home/lib – oers