论坛首页 Java版

ant 如何做增量编译?

浏览 4434 次
该帖已经被评为精华帖
作者 正文
最后更新时间:2005-01-29
每次都全部编译好慢。。
   
最后更新时间:2005-01-29
<target name="init">
        <!-- Create the time stamp -->
        <tstamp/>
        <!-- Create the build directory structure used by compile -->
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${dist.dir}"/>
        <mkdir dir="${dist.dir}/META-INF"/>
        <mkdir dir="${dist.dir}/WEB-INF"/>
        <mkdir dir="${dist.dir}/WEB-INF/lib"/>
        <mkdir dir="${dist.dir}/WEB-INF/classes"/>
        <mkdir dir="${dist.dir}/WEB-INF/template"/>

        <mkdir dir="${dist.dir}/html"/>

        <mkdir dir="${webxmlgen.dir}"/>
        <mkdir dir="${webwork2xmlgen.dir}"/>
        <mkdir dir="${project.merge.directory}"/>


    </target>


关键是 <tstamp/>,ant记住时间戳

编译任务依赖init任务即可
   
0 请登录后投票
最后更新时间:2005-01-30
有一个问题:当你修改静态常量定义的时候,对于使用静态常量的类,由于没有修改,因此ant不知道应该重新编译,这会导致隐含的错误,有没有人解决过这个问题?
   
0 请登录后投票
最后更新时间:2005-02-01
to fsword

不知道对不对:
写多个编译任务,自己控制依赖关系。
   
0 请登录后投票
最后更新时间:2005-02-18
to zzsczz: 我还是不太清楚如何通过timestamp来仅编译修改过的代码、copy修改过的文件,能不能给个例子。
   
0 请登录后投票
最后更新时间:2005-02-01
首先纠正一点, Tstamp 没有 zzsczz 提到的那个功能:
引用
Sets the DSTAMP, TSTAMP, and TODAY properties in the current project. By default, the DSTAMP property is in the format "yyyyMMdd", TSTAMP is in the format "hhmm", and TODAY is in the format "MMMM dd yyyy". Use the nested <format> element to specify a different format.

These properties can be used in the build-file, for instance, to create time-stamped filenames, or used to replace placeholder tags inside documents to indicate, for example, the release date. The best place for this task is probably in an initialization target.


ant 的大部分常用任务都支持增量编译啊, 比如说你使用 javac 任务把代码从 src 目录编译到 classes 目录, 只要你没有清除 classes 目录中的内容, 那么下次再执行 javac 任务时就只会编译那些修改过的类了, 再比如 copy 任务, 默认也是只复制更新过的那些文件.

这是 Copy 任务的 overwrite 参数说明:
引用
overwrite:
Overwrite existing files even if the destination files are newer

很清楚这些 task 自己会判断哪些文件更新过了.

至于 chenggn 的build脚本没法做到增量编辑. 建议还是看看是不是每次build之前都把原来编译的class删除掉了.
   
0 请登录后投票
最后更新时间:2005-02-01
to fsword:
这个问题确实存在, 而且好象没法自动解决, 基本上还是靠手工强制全部重新编译.

记得有一篇文章说过这个问题, 给出的解决方案是不要直接访问这些常量, 而是使用一个静态方法(类似 get....()) 返回这些常量, 这样就避免了你说的问题; 不过, 好象很少有人这样去做的...

就像你删除了源代码中的一个java文件, 除非清空编译得到的class目录或者手动删除, 否则多余出来这个class不会自动被找到和删除的.

这些都是一些小陷阱, 需要靠各人的谨慎去解决了.
   
0 请登录后投票
最后更新时间:2005-02-02
fsword 写道
有一个问题:当你修改静态常量定义的时候,对于使用静态常量的类,由于没有修改,因此ant不知道应该重新编译,这会导致隐含的错误,有没有人解决过这个问题?

这是因为javac inline造成的,可以参考这篇blog:

http://jroller.com/page/ee/20041223#javac_s_inlining_revisited
   
0 请登录后投票
最后更新时间:2005-02-17
這裡我們看到兩個問題,一個是如何用ant做增量編譯,一個是ant做增量編譯時候有隱含問題.實際這兩個問題最終是一個問題.
很多人對ant有誤解,以為ant是一個make工具.從功能上它的確是針對java世界沒有make,但它本質上和make是不同的.它實質上是一個task工具.
ant做增量編譯實際是依賴編譯器也就是javac.因為javac的增量編譯存在問題(fsword提到的問題),所以很多人從一開始學ant就接受的是先clean再make的做法,也就從來不知道javac可以增量編譯(chenggn的問題).
解決這兩個問題的途徑,是用javamake.這個工具會自己維護java文件之間的依賴關係,能正確地做到增量編譯.javamake可以很方便地作為ant的task使用,接受的參數幾乎和javac一樣,所以也基本沒有學習成本.只要定義了javamake的task,用它來替換javac就可以了.
[code:1]<taskdef name="javamake" classname="com.sun.tools.javamake.ant.JavaMake"/>[/code:1]
順便說一句,tstamp的作用是設置時間變量以便在任務中使用,對於解決java文件的依賴關係沒有絲毫用處.
http://www.experimentalstuff.com/Technologies/JavaMake/index.html[/url]
   
0 请登录后投票
最后更新时间:2005-03-01
用eclipse这样的ide工具不就可以解决以上的问题了吗?不光是final static 改了和它关联的java文件不会重新编译,只要不改动其它的java文件编译器是不会重新编译和改动文件相关的其它java文件的。
   
0 请登录后投票
论坛首页 Java版

跳转论坛:
JavaEye推荐