2011-10-15 38 views
3

我想使用FileSet来准确指示我想要使用Javac任务编译哪些文件。我不想要任何隐含的行为。然而,我的尝试却失败了。这是我到目前为止:Ant:通过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.

阅读蚂蚁文档后,我试图改变最内层标签从filesetsourcepath。这在文件被编译的意义上是有效的,但它仍然是错误的:srcfiles doesn't denote a path。我认为源只是由于隐含的规则而编译的。

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

回答

4

ant manual for javac说:

If you wish to compile only files explicitly specified and disable javac's default searching mechanism then you can unset the sourcepath attribute:

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

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

1

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

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

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

# 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目录到build目录下。

+0

目前,是的,我只是编译一个特定目录下的所有* .java文件。我想要一个通用的解决方案,以防万一发生变化。然而,我越想到它,我不确定在Java项目上会发生什么变化...... –

+0

对于java项目来说,首先你必须考虑项目的目录结构。 '标准'的方式是你必须有** build和src ** dir。其他目录是可选的:)简单的方法是,从maven目录结构看:) – martinusadyh

+0

如果你想了解更多关于java目录结构的知识,请看本页[标准目录布局简介](http://maven.apache .ORG /引导件/导入/引入到该标准的目录-的layout.html) – martinusadyh

1

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

恰恰相反for Java是正确的:如果只给一个文件到Java编译器和这个类的引用一些其他,那么编译器希望看到“别人的二进制形式。编译器将尝试三件事情:

  • 是在类路径的一些库“其他” - 如果是这样被使用的事情,因为它已经被编译
  • 那是“其他”中的目标路径编译器 - 它可能已经从源代码编译完毕,所以只需要它就可以了
  • 那是'别的'东西,可以在编译器的源代码路径中找到源文件 - 如果是的话,先编译它然后回到真实任务。

这是一点点简化但已经示出了最其中C/C++只是在不同的要点:

  • Sourcefiles是相互独立的。
  • 编译器可能希望编译的东西超出您作为新手所猜测的。
  • 许多automagic的东西只能工作,因为/如果编译器可以猜测.class文件和.java文件之间的映射。
  • 在Java中,编译器的参数并不多。所有这些设置都适用于每个源文件。另一方面,在C/C++中,您可以拥有几千字节的define参数,优化设置等等 - 对于每个源文件可能都不相同。
  • Java开发人员不想微观管理Java编译器 - 他想编译源目录中的所有文件。
  • Java开发人员不想计算源文件之间的确切和正式的依赖关系 - 机器在这样的任务上更好。

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