2013-03-22 45 views
4

我在使用Apache Ivy和Eclipse(IvyDE)并试图解决以下问题。 我有两个项目,IvyParent和IvyChild,孩子依赖父母。我为Eclipse Ivy Classpath Container选择了“解决工作区中的依赖关系”的选项。在构建期间使用Eclipse工作区解决Apache Ivy的依赖关系

Eclipse autobuilder工作得很好 - 我得到了我所有的常春藤依赖下载和包括。 我打开了父项目和子项目,我可以对父项目进行实时编辑,并查看子项目中的编辑更改。

问题是当我尝试使用Ant将子项目构建到jar中时。我的问题是,如何在显式Ant构建期间利用Workspace解析器?

我已经看过Ivy文件系统解析器,但是我想避免的是必须在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> 

以下是child 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> 

回答

4

这是解析器和发布问题。您为您的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" /> 

这里发生的事情是,我们正在讲述一个目录常春藤( ..... /存储库)为本地​​生成jar文件。

所以,你的父母现在构建在它的build.xml一个“发布”目标:

<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文件。