我想使用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
模式规则可能涵盖所有用例。
答案 0 :(得分:4)
如果您希望仅编译显式指定的文件并禁用 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 ,那么编译器希望看到'别人'以二进制形式。编译器将尝试三件事:
这有点简化,但已经显示了大多数C / C ++与之不同的要点:
.class
个文件和.java
文件之间的映射。define
参数,优化设置等等 - 可能每个源文件都有所不同。这一切都归结为Ant和Maven以及Java中任何体面的构建系统的工作方式:编译完整的源目录。所以,是的,这就是Ant想要工作的方式。