【问题标题】:compiling only part of the source tree with ant仅用 ant 编译源代码树的一部分
【发布时间】:2010-09-17 05:17:06
【问题描述】:

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

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

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

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

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

可以使用excludesincludes 参数,但它们为此目的存在问题。事实上,似乎必须明确设置所有 includes(不是自动依赖查找),以及 甚至最糟糕 excludes has priority on includes

当包含和排除都是 使用,只有文件/目录 至少匹配其中一项 模式并且不匹配 any 使用排除模式。

因此,您不能使用

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

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

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


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

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

2) 当你只是includes ant 记录类似

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

即使依赖项使它编译(远)不止一个源文件。

【问题讨论】:

  • 如果你想创建一个最小的JAR,在任务中进行;它具有所有必要的属性。如果您想要最快的编译时间...好吧,Java 中的编译总是只需要几秒钟,我不明白您如何在这里获得太多收益。专注于更有用的事情!
  • 这取决于你的项目有多大。我发现当一个项目超过 600 或 700 个类时,编译开始显着减慢,我必须尝试以某种方式将其拆分。
  • @Vladimir Dyuzhev - 这没有回答 OP 的问题。

标签: java ant jar javac


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    <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,您一定会找到您需要的答案。

    【讨论】:

    • 请查看我对上述问题的完整评论
    【解决方案3】:

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

    <property name="includeFileList" value="<name of java class>.java"/>
    
    <javac srcdir="${src.dir}" destdir="${build.dir}"
           target="1.6" debug="true" includes="${includeFileList}"/>
    

    它会起作用的。

    【讨论】:

      【解决方案4】:

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

      根据 ant 文档,&lt;javac&gt; 元素是隐式的 &lt;fileset&gt;,因此可以像 &lt;filename name="**/MyClass.java"/&gt; 一样采用 Selectors,所以这只会编译 MyClass.java:

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

      【讨论】:

        猜你喜欢
        • 2011-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多