Ant可选的classpath元素

时间:2013-02-25 12:59:11

标签: ant multi-project

我有一些模块和一个主要的可运行项目。我有共同的构建文件,

build.common.xml

<target name="build" >
  <path id="libraries.classpath">
    <fileset dir="${lib.dir}" includes="*.jar" />
  </path>
  <javac srcdir="${src.dir}" destdir="${build.dir}" includeantruntime="false" source="1.6">
    <classpath refid="libraries.classpath" />
    <classpath refid="modules.classpath" />
  </javac>
</target>

..并且每个模块在build.xml中声明自己的依赖项:

<path id="modules.classpath">
  <pathelement path="../ModuleA/${build.dir}" />
  ...
</path>

问题是如果没有内部依赖,我会得到以下异常: “找不到参考modules.classpath。”

解决方案是什么? 我如何声明可选的classpath元素?

注意: 如果有人想建议从我的模块中创建jar,请证明这一点。我将有5-10个快速更改的模块,我不想在构建过程中执行不必要的步骤。

更新:我将构建解压缩到两个不同的目标并为它们创建了条件,但没有帮助(它回应'false'并使用模块依赖构建):

<target name="build">
    <condition property="modules.classpath.set" else="false">
          <isset property="modules.classpath"/>
    </condition>

    <echo message="modules.classpath is set: ${modules.classpath.set} " />
    <antcall target="build-with-modules" />
    <antcall target="build-without-modules" />
</target>

<target name="build-with-modules" if="modules.classpath.set">
    <echo message="Building with module-dependencies" />
    <javac srcdir="${src.dir}" destdir="${build.dir}" includeantruntime="false" source="1.6">
        <classpath refid="libraries.classpath" />
        <classpath refid="modules.classpath" />
    </javac>
</target>
<target name="build-without-modules" unless="modules.classpath.set">
        <echo message="Building with  no dependent modules" />
    <javac srcdir="${src.dir}" destdir="${build.dir}" includeantruntime="false" source="1.6">
        <classpath refid="libraries.classpath" />
    </javac>
</target>

1 个答案:

答案 0 :(得分:1)

条件isreference

  

测试是否已在此项目中定义了给定引用,并且 - 可选 - 是否为预期类型。

所以,试试

<condition property="modules.classpath.set" else="false">
    <isreference refid="modules.classpath"/>
</condition>

同样在该页面上,有一个描述自定义条件的页面的链接。如果所提供的条件都不符合您的要求,那么只需写一个。

更新

ifunless<target>的逻辑是检查属性是否已设置 - 对于if,目标在设置属性时运行;对于unless,目标在未设置属性时运行 - 而不是属性的值。

我从未检查条件isreference的代码,但我认为可能应删除else="false"

如果删除该部分仍无效,那么您可能需要使用一些嵌入式groovy或beanshell脚本,或编写自己的条件。