首先,您必須定義<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/>
所以,我們有以下幾點:
- 如何使用
<taskdef>
你build.xml
將常青藤Ant任務合併到您的構建中。
- 如何使用Ivy Ant任務
<ivy:settings>
來配置Ivy。
- 如何使用
<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,其中有關於常春藤的全章。
這是迄今爲止最全面的答案,任何常春藤相關的問題,我問過或已到來對,我希望我能更多地讚揚它。感謝您花時間幫助我,這非常完美。一個快速後續問題(如果我可以):我打算擁有自己的託管存儲庫,可能由Artifactory管理。每當我和Ivy一起工作時,我都看到我的同事們將'conf'屬性定義爲'conf =「* - > *」'或'conf = compile-> default',但似乎沒有人清楚理解這些做什麼,以及爲什麼...... – IAmYourFaja
你提到它是本地Ivy配置('ivy.xml')和它解決的存儲庫之間的映射,而且你甚至足以顯示什麼是「編譯」配置可能看起來像(與'測試'配置)。但是在存儲庫端(「箭頭」運算符的右側)呢? 「'* - > *'」映射到什麼?那麼「default」呢?只是好奇,因爲無論我讀了多少次常春藤文檔,我似乎都無法將它包圍。再次感謝你的幫助! – IAmYourFaja
常春藤沒有標準配置。你必須在你的'ivy.xml'文件中定義你的配置。我的帖子中提到的標準版本映射到Maven _scopes_。我可以在我的'ivy.xml'中定義一個配置,或者我可以添加上面沒有提到的配置。例如,有些人在'ivy.xml中爲axis2和WSDL文件添加了'generated-sources'配置。事情是你必須將你的配置映射到repos的配置。我從來沒有試過'* - > *'。我想它會將'ivy.xml'中的所有配置映射到所有存儲庫配置。我必須試一試。 –