You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@ant.apache.org by "Borremans, Eric" <EB...@EFTIA.com> on 2003/01/07 19:20:22 UTC

Possible bug discussion - always recompiles

Hi all,

I have encountered the "ant always recompiles all my files even unchanged"
issue. Before searching the list I used the verbose mode and noticed that
when ant looked for the .class files in order to compare time stamps with
the .java files, it was looking in the wrong place. I proceeded to change my
srcdir to the root of my sources and used the include="" to specify what
files I wanted to compile. That solved the problem and I just found out, was
the documented solution in this list's archives.

But in my opinion this is a bug in ant's behaviour. Before reporting it as
such, I'm following the bug list advice and talk to users first. Here is why
I think it's a bug.

Take the following structure:
/source/a/b/foo.java
/build

and foo.java contains a "package a.b;" clause.

The following lines will compile foo.java and put foo.class in /build/a/b,
where it should. But when checking timestamps it will look for foo.class in
/build.

<javac srcdir="/source/a/b" destdir="/build">
   <include name="**.java"/>
   <classpath refid="class.path"/>
</javac>

Most of you know this already, I'm just summarizing.

Changing the build file to

<javac srcdir="/source"    destdir="/build">
   <include name="a/b/*.java"/>
   <classpath refid="class.path"/>
</javac>

Solves the issue.

According to me, the first build file should work too. If ant knows (agreed
it's technically javac) where to put the file when compiling them, then it
should also know where to look for them when comparing time stamps. Yet it
does not, it resolves the paths differently and ends up looking in a place
where there are no files. This could also lead to tricky issues if classes
with identical names existed in different packages (agreed, bad idea but it
would not be the first one in software development) since it compares file
names only when determining if recompilation is necessary.

My guess is that when ant compares timestamps, it does not look at the
source in the java file and has no knowledge of the package clause,
therefore does not use it in its path logic. On the other hand, javac does
use the packages and writes the files in the proper location.

So the bug is: ant does not properly resolves absolute paths in the process
of determining if a .java file needs to be recompiled.

Does anybody agree with my logic, or am I demanding too much from ant? Or
maybe I just misunderstood how it should work.

Thanks for listening and for any input. Cheers,

	Eric

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>