项目间依赖关系的方法

时间:2014-06-13 12:09:16

标签: java ant ivy

我有一个基于控制台的构建系统,它使用 Ant Ivy ,并且希望避免使用 Maven 。我使用 Ivy 获取项目的外部依赖项。我的问题是如何最好地处理我的内部项目依赖项。即我构建了许多我的模块所基于的库文件(JAR),这些文件不太可能在另一个上下文中使用。所以这些内部项目依赖项只是由build.xml文件捕获,直接通过相对路径识别所需JAR的位置(因为所有内容都在存储库中的同一源代码树下)。例如。我有 Ant “代码”,如下所示:

<path id = "compile.classpath">
  <fileset dir="${internal-project-dependency-a.dir}">
    <include name ="*.jar"/>
  </fileset>
  <fileset dir="${internal-project-dependency-b.dir}">
    <include name ="*.jar"/>
  </fileset>
  <fileset dir="${internal-project-dependency-c.dir}">
    <include name ="*.jar"/>
  </fileset>
</path>

我的问题是:上述方法是否可以接受(从最佳实践的角度来看),或者我应该在一些轻量级的“仅限本地”的Ivy存储库中打包和发布我的内部项目依赖项(如果有这样的事情) )?我使用Ivy和Ant设置我的系统的方式可以从github检查我的源代码并从控制台构建所有内容,而无需配置任何其他类型的Ivy存储库信息,我想保留该属性。

1 个答案:

答案 0 :(得分:1)

常春藤支持documentation中描述的不同类型或存储库。

  • 本地
  • 共享
  • 公共

如果没有自定义,它们位于“〜/ .ivy2”目录下。因此,我建议将每个构建配置为发布到本地存储库,并像往常一样简单地引用依赖项。您需要做的就是确保在新机器上构建顺序正确,以便以正确的顺序填充本地存储库(请参阅buildlist任务)。

使用本地仓库与引用已知相对位置的罐子没有太大区别。它确实有利于使每个项目与另一个项目分离。

实施例

├── build.xml
└── ivy.xml

Project将3个文件发布到本地存储库:

$ find ~/.ivy2/local -type f
/home/mark/.ivy2/local/myorg/hello/1.0/ivys/ivy.xml.sha1
/home/mark/.ivy2/local/myorg/hello/1.0/ivys/ivy.xml
/home/mark/.ivy2/local/myorg/hello/1.0/ivys/ivy.xml.md5
/home/mark/.ivy2/local/myorg/hello/1.0/docs/English.txt.md5
/home/mark/.ivy2/local/myorg/hello/1.0/docs/Spanish.txt.sha1
/home/mark/.ivy2/local/myorg/hello/1.0/docs/English.txt.sha1
/home/mark/.ivy2/local/myorg/hello/1.0/docs/Irish.txt.sha1
/home/mark/.ivy2/local/myorg/hello/1.0/docs/Spanish.txt.md5
/home/mark/.ivy2/local/myorg/hello/1.0/docs/English.txt
/home/mark/.ivy2/local/myorg/hello/1.0/docs/Spanish.txt
/home/mark/.ivy2/local/myorg/hello/1.0/docs/Irish.txt.md5
/home/mark/.ivy2/local/myorg/hello/1.0/docs/Irish.txt

的build.xml

<project name="demo" default="publish" xmlns:ivy="antlib:org.apache.ivy.ant">

    <target name="init">
      <ivy:resolve/>
    </target>

    <target name="build" depends="init">
      <mkdir dir="build"/>
      <echo file="build/English.txt">Hello world</echo>
      <echo file="build/Irish.txt">Dia dhuit</echo>
      <echo file="build/Spanish.txt">Hola mundo</echo>
    </target>

   <target name="publish" depends="clean,build">
      <ivy:publish pubrevision="1.0" status="release" resolver="local" >
         <artifacts pattern="build/[artifact].[ext]"/>
      </ivy:publish>
   </target>

    <target name="clean" description="Cleanup build files">
        <delete dir="build"/>
    </target>

</project>

的ivy.xml

<ivy-module version="2.0">
  <info organisation="myorg" module="hello"/>
  <publications>
    <artifact name="English" ext="txt" type="doc"/>
    <artifact name="Irish" ext="txt" type="doc"/>
    <artifact name="Spanish" ext="txt" type="doc"/>
  </publications>
</ivy-module>