Ant:将文件集与javac任务一起使用

时间:2011-10-15 16:26:49

标签: ant

我想使用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我要编译哪些文件?或者这不是Ant应该如何工作?我来自C ++背景,其中识别源文件是构建过程的重要部分。但是,考虑到Java的文件命名和目录结构要求,隐式**/*.java模式规则可能涵盖所有用例。

3 个答案:

答案 0 :(得分:4)

ant manual for javac说:

  

如果您希望仅编译显式指定的文件并禁用   javac的默认搜索机制然后你可以取消设置源路径   属性:

<javac sourcepath="" srcdir="${src}"
       destdir="${build}" >
    <include name="**/*.java"/>
    <exclude name="**/Example.java"/>
</javac>
但是,我认为这不是一个好主意。在精心设计的项目中,应编译给定目录(或一组目录)中的所有文件。不应该编译的文件根本不应该存在,或者应该在一个单独的目录中。

答案 1 :(得分:1)

你想要什么?从单个目录编译所有* .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代码编译为构建目录。

答案 2 :(得分:1)

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

Java恰恰相反:如果只向Java编译器提供一个文件,并且该类引用 else ,那么编译器希望看到'别人'以二进制形式。编译器将尝试三件事:

  • 在类路径中的某个库中是'else' - 如果是这样的话,因为它已经被编译了
  • 编译器的目标路径中是否为'else' - 它可能已经从源代码编译过来,所以只需要它就可以了
  • 是'else'是在编译器的源路径中可以找到源文件的东西 - 如果是,那么先编译它然后再回到真正的任务。

这有点简化,但已经显示了大多数C / C ++与之不同的要点:

  • 源文件彼此独立。
  • 编译器可能希望编译比你新手想象的更多的东西。
  • 大部分自动化的东西只是因为/如果编译器可以猜测.class个文件和.java文件之间的映射。
  • 在Java中,编译器的参数不多。所有这些设置都适用于每个源文件。另一方面,在C / C ++中,您可以拥有几千字节的define参数,优化设置等等 - 可能每个源文件都有所不同。
  • Java开发人员不想对Java编译器进行微观管理 - 他希望编译源目录中的所有文件。
  • Java开发人员不希望弄清楚源文件之间的确切和正式的依赖关系 - 一台机器更适合这样的任务。

这一切都归结为Ant和Maven以及Java中任何体面的构建系统的工作方式:编译完整的源目录。所以,是的,这就是Ant想要工作的方式。