用ant编译源树的一部分

Dav*_*ide 9 java ant jar javac

假设我在src/tree中有我的源代码(可能在我的测试/树中).说我想只编译那棵树的一部分.我可能想要这样做的原因是多种多样的.作为一个例子,我可能想要创建尽可能小的jar(不包括某些类),或者我可能想要编译的最快的编译时间.我绝对想编译所有的依赖项!

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

javac -d build/ -cp whatever -sourcepath src src/path/to/MyClass.java
Run Code Online (Sandbox Code Playgroud)

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

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

可以使用excludesincludes参数,但它们是有问题的.事实上,它似乎是一个有明确设置所有的includes(不是自动的依赖查找),并且即使最差的是排除优先于包括:

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

因此,你不能使用

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath"
            excludes="**/*.java" includes="src/path/to/MyClass.java" />  
Run Code Online (Sandbox Code Playgroud)

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

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


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

1)我确实阅读了文档(参见上面的链接),但目前还不清楚只是includes你实际上也排除了其他一切

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

[javac] Compiling 1 source file to /my/path/to/build
Run Code Online (Sandbox Code Playgroud)

即使依赖项使其编译(多)只是一个源文件.

Mar*_*ing 13

你为什么要排除以及包括?如果您至少有一个包含,则只有在明确包含文件时才编译文件.所以这应该工作:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath"
        includes="src/path/to/MyClass.java" />
Run Code Online (Sandbox Code Playgroud)

或者更灵活:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath">
    <include name="src/path/to/MyClass.java"/>
    <include name="src/path/to/AnotherClass.java"/>
</javac>
Run Code Online (Sandbox Code Playgroud)

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

<jar jarfile="${outlib}/something.jar">
    <fileset dir="${build.dir}">
        <include name='src/path/to/classes' />
    </fileset>
</jar>
Run Code Online (Sandbox Code Playgroud)

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