Ant:通过javac任务使用文件集

我想使用FileSet来准确地指出我想用Javac任务编译哪些文件。 我不想要任何隐含的行为。 然而,我的尝试却失败了。 这是迄今为止我所得到的结果:

包含我所有源文件的FileSet。

<fileset id="srcfiles" dir="${srcdir}">
    <include name="**/*.java"/>
</fileset>

并尝试将其传递给javac。

<target name="build">
    <javac srcdir=".">
        <fileset refid="srcfiles"/>
    </javac>
</target>

这给了我这个错误: javac doesn't support the nested "fileset" element.

在阅读Ant文档之后,我尝试将最内层的标记从fileset更改为源sourcepath 。 这在文件被编译的意义上工作,但它仍然出错: srcfiles doesn't denote a path 。 我认为源只是由于隐含的规则而编译的。

我怎样才能明确地告诉javac我想编译的单个文件? 或者这不是蚂蚁应该如何工作? 我来自C ++背景,其中识别源文件是构建过程的重要组成部分。 但是,鉴于Java的文件命名和目录结构要求,可能隐含的**/*.java模式规则涵盖了所有用例。


javac的ant手册说:

如果您希望仅编译明确指定的文件并禁用javac的默认搜索机制,则可以取消设置sourcepath属性:

<javac sourcepath="" srcdir="${src}"
       destdir="${build}" >
    <include name="**/*.java"/>
    <exclude name="**/Example.java"/>
</javac>

不过,我认为这不是一个好主意。 在设计良好的项目中,应该编译给定目录(或一组目录中)的所有文件。 不应该编译的文件应该不存在,或者应该放在单独的目录中。


你想要什么 ? 编译单个目录下的所有* .java代码? 或者只编译一个文件?

如果你想编译你所有的java源代码? 然后,您必须定义您的源代码文件所在的位置,然后您必须定义构建目录所在的位置。 编译您的java代码后,此构建目录用于* .class文件。

简单的方法是,首先你必须创建一个文件build.properties在这个文件中,你可以定义你的源代码目录的位置,你的构建目录等等。这是build.properties文件的简单例子

# Source Code Properties ---------------------------
project.dir=.
src.dir=${folder.project}/src
dist.dir=${folder.project}/dist
build.dir=${folder.project}/build
test.dir=${folder.project}/testing

然后,在你的build.xml文件中,你可以像这样编译你的java代码:

<!-- define build.properties file -->
<property file="build.properties" />

<target name="compile" description="Compile all java code from src dir">
    <javac  srcdir="${src.dir}" 
            destdir="${build.dir}" 
     />
</target>

通过这个ant任务,你可以在src目录下编译所有的java代码来建立目录。


在这种情况下用C / C ++术语思考是徒劳的。 在C / C ++中,您通常有一个Makefile,您可以列出所有要编译的文件,每个*.c*.cc文件从编译器的角度来看都是相互独立的。

对Java来说恰恰相反:如果只向Java编译器提供一个文件,并且此类引用了其他类,则编译器希望以二进制形式查看“else”。 编译器会尝试三件事情:

  • 那是类路径中某个库中的'else' - 如果是这样的话,因为它已经被编译过了
  • 在编译器的目标路径中是否是“其他” - 它可能已经从源代码编译完毕,因此只需将其编译即可
  • 那是否就是在编译器的源代码路径中可以找到源文件的东西 - 如果是这样,那么先编译它,然后再回到真正的任务。
  • 这有点简化了,但是已经显示了C / C ++的大部分重点:

  • 源文件不是彼此独立的。
  • 编译器可能需要编译的东西超出您作为新手所能猜到的。
  • 很多automagic的东西只是因为/如果编译器可以猜测.class文件和.java文件之间的映射。
  • 在Java中,编译器的参数并不多。 所有这些设置都适用于每个源文件。 另一方面,在C / C ++中,您可以拥有几千字节的define参数,优化设置等等 - 对于每个源文件可能都不相同。
  • Java开发人员不想微观管理Java编译器 - 他想编译源目录中的所有文件。
  • 一位Java开发人员不想确定源文件之间的确切和正式的依赖关系 - 一台机器对于像这样的任务更好。
  • 这一切归结为Ant和Maven以及Java中任何体面的构建系统的工作方式:编译完整的源代码目录。 所以是的,这就是Ant想要工作的方式。

    链接地址: http://www.djcxy.com/p/60373.html

    上一篇: Ant: Using a fileset with the javac task

    下一篇: Replicating system libraries for Android from Eclipse to Ant