2

我有一些模块和一个主要的可运行项目。我有通用的构建文件,并且

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>

问题是如果没有内部依赖,我会得到以下异常:“找不到参考模块。类路径。”

解决方案是什么?我如何声明一个可选的类路径元素?

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

更新:我将构建提取到两个不同的目标中并为它们创建了一个条件,但没有帮助(它与“错误”相呼应并使用模块依赖项构建):

<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>
4

1 回答 1

1

条件isreference

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

所以,试试

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

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

更新:

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

我从未检查过条件的代码isreference,但我认为也许else="false"应该删除。

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

于 2013-02-25T15:35:17.347 回答