[英]Apache Ivy resolve dependencies using Eclipse workspace during Ant build
我正在使用Apache Ivy和Eclipse(IvyDE)並嘗試解決以下問題。 我有兩個項目,IvyParent和IvyChild,孩子依賴於父母。 我為Eclipse Ivy Classpath Container選擇了“解決工作空間中的依賴關系”選項。
Eclipse autobuilder工作得很好 - 我下載並包含了所有的Ivy依賴項。 我打開了父項目和子項目,我可以對父項進行實時編輯,並查看子項中的編譯更改。
問題是當我嘗試使用Ant將子項目構建到jar中時。 我的問題是, 如何在顯式Ant構建期間利用Workspace解析器?
我已經研究了常春藤文件系統解析器,但是我想避免的是在Ant構建子項之前必須明確重建父項目。
我得到的錯誤如下:
[ivy:retrieve] :: problems summary ::
[ivy:retrieve] :::: WARNINGS
[ivy:retrieve] module not found: org.example#ParentModule;latest.integration
[ivy:retrieve] ==== local: tried
[ivy:retrieve] ...
[ivy:retrieve] ==== shared: tried
[ivy:retrieve] ...
[ivy:retrieve] ==== public: tried
[ivy:retrieve] ...
[ivy:retrieve] ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:retrieve] :: UNRESOLVED DEPENDENCIES ::
[ivy:retrieve] ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:retrieve] :: org.example#ParentModule;latest.integration: not found
[ivy:retrieve] ::::::::::::::::::::::::::::::::::::::::::::::
BUILD FAILED
C:\Users\user\workspace\IvyExampleChild\build.xml:15: impossible to resolve dependencies:
resolve failed - see output for details
這是父項目ivy.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
<info organisation="org.example" module="ParentModule" status="integration" />
<dependencies>
<dependency org="commons-lang" name="commons-lang" rev="2.6"/>
</dependencies>
</ivy-module>
這是子項目ivy.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
<info organisation="org.example" module="ChildModule" status="integration" />
<dependencies>
<dependency org="org.example" name="ParentModule" rev="latest.integration"/>
</dependencies>
</ivy-module>
這是子build.xml:
<project xmlns:ivy="antlib:org.apache.ivy.ant" name="ChildModule" default="release">
<property name="build.dir" value="build" />
<property name="build.dir.classes" value="${build.dir}/classes" />
<property name="src.dir" value="src" />
<property name="output.jar" value="${build.dir}/${ant.project.name}.jar" />
<target name="clean">
<delete includeemptydirs="true" quiet="true">
<fileset dir="${build.dir}" />
</delete>
</target>
<target name="apache-ivy" depends="clean">
<ivy:retrieve />
<ivy:cachepath pathid="ivy.build.path" conf="default" />
</target>
<target name="release" depends="apache-ivy">
<echo message="compiling ${src.dir}..." />
<mkdir dir="${build.dir}" />
<mkdir dir="${build.dir.classes}" />
<javac srcdir="${src.dir}" destdir="${build.dir.classes}" classpathref="ivy.build.path"/>
<jar destfile="${output.jar}" basedir="${build.dir}"/>
</target>
</project>
這是一個解析器和發布問題。 您的ParentModule構建需要將其jar“發布”到特定目錄。 然后你的子模塊構建應該使用可以找到這個特定目錄的解析器。
所以..例如,ivy_settings可能看起來像:
<ivysettings>
<properties file="./ivysettings.properties"/>
<property name="repository.dir" value="${ivy.build.dir}/repository"/>
<settings defaultResolver="chain"/>
<resolvers>
<chain name="chain">
<filesystem name="internal">
<ivy pattern="${repository.dir}/[module]/ivy.xml" />
<artifact pattern="${repository.dir}/[module]/[artifact].[ext]" />
</filesystem>
<ibiblio name="maven2" m2compatible="true"/>
</chain>
</resolvers>
</ivysettings>
和你的build.xml文件應該有
<ivy:settings file="${ivy.build.dir}/ivysettings.xml" />
這里發生的事情是我們告訴ivy關於本地構建jar文件的目錄(..... / repository)。
所以你的父版本現在在它的build.xml中有一個'publish'目標:
<target name="publish" depends="jar, jarSources" description="--> publish this project in the ivy repository">
<delete file="${dist.dir}/lib/ivy.xml"/>
<ivy:publish artifactspattern="${dist.dir}/lib/[artifact](-[classifier]).[ext]"
resolver="internal"
status="integration"
overwrite="true"/>
<echo message="project ${ant.project.name} integration published" />
</target>
所以..運行它並確認您的ParentModule.jar文件顯示在您的存儲庫目錄中。
在那里,您的子模塊應該能夠“解析”您的父模塊jar文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.