我有一个Java项目的Apache Ant构建文件,其中包含用于编译源代码的javac命令。该项目有一些特殊的限制,它由小的子项目组成。大多数这些子项目具有以下文件夹结构:
/docroot
----/WEB-INF
--------/lib
--------/src
-----------A.java
----------- ... (more java classes)
--------/service
-----------B.java
----------- ... (more java classes)
src和service都是源文件夹。 A.java导入/ service文件夹中的一些类,例如B.java。在eclipse中一切正常,A.java导入B.java没有任何错误或问题,所以我认为classpath是正确的。如果我从Ant运行javac命令,当他尝试编译A.java时,它会给我一个错误说:
找不到符号B.java
在我的javac命令中,我设置了一个源目录= docroot / WEB-INF / src。如果我还将docroot / WEB-INF / service设置为源目录,它也可以工作。但这是这个解决方案的问题:一些子项目只有一个源文件夹,“docroot / WEB-INF / src”。这意味着如果我为javac命令设置了两个源目录,对于具有单个源目录“docroot / WEB-INF / src”的项目,它将抛出一个错误,表示该子项目没有文件夹“docroot / WEB -INF /服务”。
我该如何解决这个问题?
<antcall target="compile-java">
<param name="javac.classpathref" value="plugin.classpath" />
<param name="javac.destdir" value="docroot/WEB-INF/classes" />
<param name="javac.srcdir" value="docroot/WEB-INF/src" />
<reference refid="plugin-lib.classpath" torefid="plugin-lib.classpath" />
</antcall>
<target name="compile-java">
<javac
classpathref="${javac.classpathref}"
compiler="${javac.compiler}"
debug="${javac.debug}"
deprecation="${javac.deprecation}"
destdir="${javac.destdir}"
fork="${javac.fork}"
includeAntRuntime="false"
memoryMaximumSize="${javac.memoryMaximumSize}"
nowarn="${javac.nowarn}"
encoding="${javac.encoding}"
>
<src path="${javac.srcdir}"/>
</javac>
<copy todir="${javac.destdir}">
<fileset dir="${javac.srcdir}" excludes="**/*.java" />
</copy>
</target>
答案 0 :(得分:0)
<src path="${javac.srcdir}"/>
表示${javac.srcdir}
被解释为路径(冒号或分号分隔,具体取决于您的平台),而不是单个目录。所以你可以在这里提供多个目录。
<path id="module.srcdir.path">
<pathelement location="docroot/WEB-INF/src" />
<pathelement location="docroot/WEB-INF/services" />
</path>
<property name="module.srcdir" refid="module.srcdir.path" />
<antcall target="compile-java">
<param name="javac.classpathref" value="plugin.classpath" />
<param name="javac.destdir" value="docroot/WEB-INF/classes" />
<param name="javac.srcdir" value="${module.srcdir}" />
<reference refid="plugin-lib.classpath" torefid="plugin-lib.classpath" />
</antcall>
答案 1 :(得分:0)
现在我找到了解决方案。我为每个需要两个源目录进行编译的子项目创建了一个单独的构建文件。在其中,我重写了javac命令,为每个特定情况设置必要的源目录。这样,“常规”javac命令仍将使用单个源执行,以与仅需要一个源目录的子项目兼容。