【问题标题】:How to force ant javac task to overwrite the class file in the destination directory?如何强制 ant javac 任务覆盖目标目录中的类文件?
【发布时间】:2016-03-25 15:33:44
【问题描述】:

这是我想要实现的一个非常简化的版本。我有两个目录,Directory1Directory2。这两个目录都包含 Java 源文件。 Directory2 中的某些文件可以与Directory1 中的文件具有相同的完全限定类名。

使用 ant,文件被编译到名为 CompileDirectory 的目录中,首先从 Directory1,然后从 Directory2。我希望编译Directory2 中的文件并覆盖Directory1 中的已编译类文件。但是,ant 似乎忽略了具有相同完全限定类名的类。

这是一个简单的例子 -

目录结构

$ ls -R
.:
build.xml  CompileDirectory  Directory1  Directory2

./CompileDirectory:

./Directory1:
A.java

./Directory2:
A.java

构建.xml

<project name="TestProject" default="build" basedir=".">

<target name="build" depends="javac1, javac2" />

<target name="javac1">
     <javac srcdir="${basedir}/Directory1" destdir="CompileDirectory" includeantruntime="false"/>
</target>

<target name="javac2">
     <javac srcdir="${basedir}/Directory2" destdir="CompileDirectory" includeantruntime="false"/>
</target>

</project>

蚂蚁跑

$ ant -buildfile build.xml 

Buildfile: ...(path).../build.xml

javac1:
    [javac] Compiling 1 source file to ...(path).../CompileDirectory

javac2:

build:

BUILD SUCCESSFUL
Total time: 0 seconds

可以看出,上面的javac2 目标什么也不做。

当我运行 Java 程序时,我看到类文件来自 Directory1。

$ cd CompileDirectory/
$ java A 
I am class A from directory 1

有没有办法强制javac2目标中的javac任务编译Directory2中的源文件并覆盖CompileDirectory中的类文件?

【问题讨论】:

    标签: java ant javac


    【解决方案1】:

    这与文件的时间戳以及编译器是否认为源比类文件更新有关。

    <project name="TestProject" default="build" basedir=".">
    
    <target name="build" depends="javac1, touch2, javac2" />
    
    <target name="javac1">
         <javac srcdir="${basedir}/Directory1" destdir="CompileDirectory" includeantruntime="false"/>
    </target>
    
    <target name="touch2">
         <sleep seconds="2" />
         <touch datetime="now">
        <fileset dir="${basedir}/Directory2" />
         </touch>
    </target>
    
    <target name="javac2">
         <javac srcdir="${basedir}/Directory2" destdir="CompileDirectory" includeantruntime="false"/>
    </target>
    
    </project>
    

    【讨论】:

      【解决方案2】:

      避免这种情况的其他可能方法是创建一个阶段目录并在那里编译类并使用覆盖选项复制回原始目录。

        <project name="TestProject" default="build" basedir=".">
      
      <target name="build" depends="javac1, javac2, copy1" />
      
      <target name="javac1">
           <javac srcdir="${basedir}/Directory1" destdir="CompileDirectory" includeantruntime="false"/>
      </target>
      
      <target name="javac2">
           <javac srcdir="${basedir}/Directory2" destdir="CompileDirectory1" includeantruntime="false"/>
      </target>
      <target name="copy1">
         <copy overwrite="on" todir="CompileDirectory">
             <fileset dir="CompileDirectory1">
                      <include name ="**/*.*"/>
             </fileset>
         </copy>
      </target>
      

      【讨论】:

        猜你喜欢
        • 2011-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多