为什么ant编译每个运行的所有类?

Dan*_*ane 9 java ant

我更习惯于制作,所以我很困惑为什么ant在没有更改源时重新编译类.我已经读过在某些使用泛型的情况下需要重新编译,但我不确定这对我的项目是否必要.

另外,在javac任务中,我设置了includeDestClasses ="true"

这是我正在使用的一些目标

<target name="init">
        <mkdir dir="${build}"/>
        <mkdir dir="${dist}"/>
    </target>
    <target name="compile" depends="init,util,semantics" description=""/>
    <target name="util" depends="" description="">
        <javac destdir="${build}" classpath="project.class.path" debug="on" srcdir="${src}/util" includeDestClasses="true" source="1.5">
            <classpath refid="project.class.path"/>
        </javac>
    </target>
Run Code Online (Sandbox Code Playgroud)

Bob*_*off 9

尝试修改javac任务的开始标记以包含srcdir属性和includes属性:

<javac destdir="${build}" classpath="project.class.path" debug="on" srcdir="${src}" includes="util/**" includeDestClasses="true" source="1.5">

  • 是的,当ant查找已更改的源文件时,它不会读取任何文件的内容 - 特别是,它不会读取任何类的包声明.相反,它从文件名及其在源目录层次结构中的位置推断出类的完全限定名称.因此,例如,您可能有一个类util.codec.Base64,其源代码位于$ {src} /util/codec/Base64.java,但您的javac任务正在将其完全限定名称推断为codec.Base64,因为你告诉它源代码层次结构的根目录是$ {src}/util而不是$ {src}. (4认同)

Edw*_*ges 7

您的src和dest目录不等效,因此ant无法有效地统计输出文件以进行比较.

这是一个FAQ:http: //ant.apache.org/faq.html#always-recompiles