用ant编译源树的一部分

时间:2008-10-14 23:14:04

标签: java ant jar javac

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

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

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

现在,你怎么能用蚂蚁做到这一点? javac ant task compiles everything

  

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

可以使用excludesincludes参数,但这些参数存在问题。事实上,似乎必须明确设置所有includes(非自动依赖查找),甚至最差 excludes has priority on includes

  

包含和排除时都是   使用过,只有文件/目录   匹配至少一个包含   模式并且与的任何不匹配   使用排除模式。

因此,你不能使用

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

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

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


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

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

2)当你includes蚂蚁记录

之类的东西时
[javac] Compiling 1 source file to /my/path/to/build

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

4 个答案:

答案 0 :(得分: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>

同样,您可以使用多个包含来组合单独的包。尝试使用包含和read the documentation,您一定会找到所需的答案。

答案 1 :(得分:3)

老问题,但我正在努力解决同样的问题,并找到了一个更优雅的解决方案。所以这是为了将来的参考:

根据ant文档,<javac>元素是一个隐式<fileset>,因此可以像<filename name="**/MyClass.java"/>那样使用Selectors,所以这只会编译MyClass.java:< / p>

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

答案 2 :(得分:0)

实际上,只有检查所有内容,如果你连续两次运行编译,你会发现第二个更快。实际上,很容易被说服错过的东西。

如果您甚至不想让它考虑所有事情,那么您将不得不将其分解为更小的模块/项目/源代码树,以便您明确地告诉蚁群编译什么。

答案 3 :(得分:0)

只提供您要构建的以逗号分隔的文件列表。让我们说例子

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

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

它会起作用。