Saturday, May 29, 2010

ECJ - Eclipse Compiler for Java

Eclipse provides and uses its own compiler that is not javac
  • The Eclipse compiler is used inside the IDE (Eclipse)
  • The Eclipse compiler can also be used as a pure batch compiler outside of Eclipse
Finding the Batch compiler

The batch compiler class is located in the JDT Core plug-in. The name of the class is org.eclipse.jdt.compiler.batch.BatchCompiler. It is packaged into plugins/org.eclipse.jdt.core_3.5.2.v_981_R35x.jar. Since 3.2, it is also available as a separate download. The name of the file is ecj.jar. Its corresponding source is also available. To get them, go to the download page, select a build and search for the section JDT Core Batch Compiler. This jar contains the batch compiler and the javac ant adapter.

Running the batch compiler from command line

Check compiler version
$ java -jar ecj-3.5.2.jar -version
or
$ java -jar org.eclipse.jdt.core_3.5.2.v_981_R35x.jar -version

Eclipse Compiler for Java (TM) 0.981_R35x, 3.5.2 release, Copyright IBM Corp 2000, 2009. All rights reserved.


Compile a source file
$ java -jar ecj-3.5.2.jar HelloWorld.java
or
$ java -jar org.eclipse.jdt.core_3.5.2.v_981_R35x.jar HelloWorld.java

Running the batch compiler programmatically
Use the static compile(String commandLine, PrintWriter outWriter, PrintWriter errWriter, CompilationProgress progress) method of the class BatchCompiler.

org.eclipse.jdt.compiler.CompilationProgress progress = null; // instantiate your subclass
org.eclipse.jdt.internal.compiler.batch.BatchCompiler.compile(
"-classpath rt.jar A.java",
new PrintWriter(System.out),
new PrintWriter(System.err),
progress);

You can control how progress is reported, or how the batch compiler is canceled, by subclassing the class org.eclipse.jdt.compiler.CompilationProgress.

Using the ant javac adapter

The Eclipse compiler can be used inside an Ant buildfile using the javac adapter. In order to use the Eclipse compiler, you simply need to define the build.compiler property in your buildfile.

property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"

More Information
Look in Eclipse SDK - Help : JDT Plug-in Developer Guide > Programmer's Guide > JDT Core > Compiling Java code

So who all are using the Eclipse Java Compiler - besides developers using Eclipse for writing java code :) ? Apache Tomcat uses ECJ to compile JSPs, IntelliJ IDEA has support ECJ, as of GCJ 4.3, GCJ integrates with ECJ, Liferay Builds with ECJ, and there are many others.

3 comments:

  1. Are the sequences of byte codes for methods generated by the Eclipse Java Compiler different from those generated by Oracle Hotspot?

    ReplyDelete
  2. @Marlene Hotspot is a VM not a compiler. I assume you want to ask whether class files generated by ECJ and Oracle Javac compiler are the same or not? They are equivalent, but not exactly the same i.e. both compilers conform to the Java specifications and hence produce equivalent results, however they may be differences in the class files as the compilers are 2 different implementations.

    ReplyDelete
    Replies
    1. @Deepak Here is one difference I came across:

      “String s = getClass().getName() + "Props";”
      Is generated as either:
      “String s = (new StringBuilder(String.valueOf(getClass().getName()))).append("Props").toString();”
      or
      “String s = (new StringBuilder()).append(getClass().getName()).append("Props").toString();”

      Delete