Incremental java compile AKA javac print compile dependencies

Jonathan Gibbons jonathan.gibbons at
Mon May 24 21:29:46 PDT 2010


This question is better asked on compiler-dev at

There are various ways you can get the information you are asking, in a 
single invocation of the compiler and without changing the compiler.

One way would be to invoke the compiler via the JSR 199 API. You can 
provide your own JavaFileManager which can keep track of files read and 
written by the compiler. For the class files that are written, you can 
analyze the class files to determine all the classes that are referenced 
by that class file. Class files also identify the source files that they 
come from. That should be enough to get you almost all the information 
that you need. The only information you'll miss using that technique is 
inlined constants.

-- Jon G

On 05/24/2010 07:23 PM, Joshua Maurice wrote:
> I'm sorry. I'm new to this list, and I'm not sure if this is the appropriate
> forum. I was looking at the javac source code, and I am now looking for help
> or guidance. Specifically, I want to create an incrementally correct build
> system for java, preferably without having to (re)write a Java compiler. I
> need some additional information to be printed from javac to get full
> dependency information. Please see:
> for a detailed discussion. The short version is that -verbose output almost
> is what I need. I need to know the full list of class files loaded for each
> java file being compiled, and the full list of java files in the compile
> used by each java file being compiled; that is, the full list of java file
> and class file \compile\ dependencies of each java file in the compile. One
> can already get this information by calling javac once on the set of
> interested java files to do the compile, then an additional java -verbose
> once per java file to get the dependency information.
> However, calling javac so many times is quite slow, and unnecessary. I would
> like to enhance javac to print out this dependency information with one
> invocation aka without resorting to calling javac once per java file, and
> preferably get this change into the actual official released javac.
> PS: Yes this information on its own is insufficient to do an incrementally
> correct java compile. However, when combined with Ghost Dependencies (please
> see:
> ), I think that this would actually work. I have some tests to this effect
> already with my proposed system which currently calls javac once per java
> file to get the compile dependency information.

More information about the compiler-dev mailing list