10

假设我在我的 src/ 树中有我的资源(也可能在我的 test/ 树中)。假设我只想编译那棵树的一部分。我可能想要这样做的原因是多种多样的。举个例子,我可能想要创建尽可能小的 jar(不包括某些类),或者我可能想要我正在编译的最快的编译时间。不过,我绝对想编译所有依赖项!

这可以通过命令行轻松实现:

javac -d build/ -cp whatever -sourcepath src src/path/to/MyClass.java

现在,你怎么能用蚂蚁做到这一点?javac ant任务编译所有内容

将递归扫描源目录和目标目录以查找要编译的 Java 源文件。

可以使用excludesandincludes参数,但它们为此目的是有问题的。事实上,似乎必须明确设置所有includes(不是自动依赖查找),甚至最坏排除优先于包含

当同时使用包含和排除时,仅使用与至少一个包含模式匹配且不匹配任何排除模式的文件/目录。

因此,您不能使用

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath"
            excludes="**/*.java" includes="src/path/to/MyClass.java" />  

因为它不会编译任何东西:-(

有没有办法javac用 ant 实现那个简单的命令行?


编辑:谢谢你的回答,萨迪,我接受它,因为它确实以我在这个问题中想知道的方式工作。但是我有几条评论(太长了,不能在您的答案的评论字段中):

1)我确实阅读了文档(请参阅上面的链接),但不清楚是否只有includes您实际上也排除了其他所有内容

2)当你只是includes蚂蚁记录类似

[javac] Compiling 1 source file to /my/path/to/build

即使依赖项使其编译(远)不仅仅是一个源文件。

4

4 回答 4

13

为什么要排除和包含?如果您至少有一个包含,则仅在显式包含文件时才编译文件。所以这应该工作:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath"
        includes="src/path/to/MyClass.java" />

或者更灵活:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath">
    <include name="src/path/to/MyClass.java"/>
    <include name="src/path/to/AnotherClass.java"/>
</javac>

要在 jar 中仅包含某些包或类,请使用文件集属性

<jar jarfile="${outlib}/something.jar">
    <fileset dir="${build.dir}">
        <include name='src/path/to/classes' />
    </fileset>
</jar>

同样,您可以使用多个包含来组合单独的包。尝试包含并阅读文档,您一定会找到所需的答案。

于 2008-10-15T02:39:07.927 回答
3

老问题,但我在同一个问题上苦苦挣扎,找到了一个更优雅的解决方案。所以在这里,以供将来参考:

根据 ant 文档,该<javac>元素是隐式<fileset>的,因此可以采用Selectors like <filename name="**/MyClass.java"/>,所以这只会编译 MyClass.java:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath">
  <filename name="**/path/to/MyClass.java"/>
</javac>
于 2015-07-12T12:54:56.927 回答
0

实际上,ant 只检查所有内容,如果您连续运行两次编译,您会发现第二次要快得多。实际上,很容易被说服错过一些事情。

如果您甚至不希望它考虑所有内容,则必须将其分解为较小的模块/项目/源代码树,以便明确告诉 ant 编译什么。

于 2008-10-15T01:51:13.013 回答
0

只需提供您要构建的文件的逗号分隔列表。举个例子

<property name="includeFileList" value="<name of java class>.java"/>

<javac srcdir="${src.dir}" destdir="${build.dir}"
       target="1.6" debug="true" includes="${includeFileList}"/>

它会起作用的。

于 2013-06-23T13:59:54.083 回答