【问题标题】:Ant javac source directory not workingAnt javac源目录不起作用
【发布时间】:2014-02-13 15:02:46
【问题描述】:

我有一个用于 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 没有任何错误或问题,所以我认为类路径是正确的。如果我从 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>

【问题讨论】:

  • 发布您的build.xml 文件。
  • 我不知道你在这里做什么,但我可以肯定地说一件事:你不要将源文件放在 WEB-INF 文件夹中。该目录仅用于可部署文件(/lib 中的 jar 文件、/class 中的类文件、WEB-INF 本身中的配置文件)。
  • @hmjd 你想要构建文件中的特定目标吗?因为我的构建文件有数百行。整个 Ant 进程由不同的构建文件组成..
  • @Gimby 我明白你在告诉我什么,但是这个项目是一个已知软件的扩展,它遵循推荐的结构......
  • @PauloRodrigues,建议创建一个小的build.xml,其中包含javac 命令的必要元素。您可能会因为创建较小的构建文件而自己发现问题。

标签: java ant build-process


【解决方案1】:
<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>

【讨论】:

  • 感谢您提前回复。我知道我可以做到这一点,甚至可以指定用: 分隔的路径,例如 path1:path2。但是如果我这样做,在编译没有2个源目录的子项目时,ant会抛出一个错误,说其中一个目录不存在。
  • @PauloRodrigues 抱歉,我将其理解为 compile-java 是通用目标,antcall 是针对此特定子模块的。
【解决方案2】:

现在我找到了解决方案。我为每个需要两个源目录来编译的子项目创建了一个单独的构建文件。在其中,我覆盖了 javac 命令来为每个特定情况设置必要的源目录。这样,“常规” javac 命令仍将使用单个源执行,以与只需要一个源目录的子项目兼容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2020-12-02
    • 2017-09-02
    • 2013-12-01
    相关资源
    最近更新 更多