Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


The JastAdd extensible Java compiler.

License & Copyright

  • Copyright (c) 2005-2008, Torbjörn Ekman
  • Copyright (c) 2005-2016, ExtendJ Committers

All rights reserved.

ExtendJ is covered by the Modified BSD License. The full license text is distributed with this software. See the LICENSE file.

Tools Used

ExtendJ uses these libraries:

  • JastAdd2 R20130212, Copyright (c) 2005-2013, The JastAdd Team. JastAdd2 is covered by the Modified BSD License. See the file licenses/JastAdd2-BSD for the full license text.
  • Beaver 0.9.11, Copyright (c) 2003-2011 Alexander Demenchuk. Beaver is covered by the Modified BSD License. See the file licenses/Beaver-BSD for the full license text.
  • JFlex 1.4.3, Copyright (c) 1998-2009 Gerwin Klein. JFlex is covered by the GNU General Public License. See the file licenses/JFlex-GPL for the full license text.
  • JastAddParser, Copyright (c) 2005, The JastAdd Team. JastAddParser is covered by the Modified BSD License. See the file licenses/JastAddParser-BSD for the full license text.
  • RagDoll R20120208, Copyright (c) 2011-2012 Jesper Öqvist. RagDoll is covered by the GNU General Public License Version 2, with the Classpath Exception. See the file licenses/RagDoll-GPL for the full license text.

The only library used by ExtendJ at runtime is the Beaver runtime component beaver-rt.jar.


ExtendJ is built using Apache Ant or Gradle.

The Ant build has one Ant script for each module, with top-level Ant script that contains targets to build ExtendJ with support for various versions of Java. The default target will build ExtendJ for the highest supported Java version.

If you have Ant installed you can get a list of available build targets by entering the following in a terminal:

ant -p

To build the Java 8 version of ExtendJ with Ant, use the following command:

ant clean java8 jar

The Gradle build is organized into subprojects for each supported Java version.

To build the Java 8 version of ExtendJ with Gradle, use the following command:

gradle clean :java8:jar

Building with a custom JastAdd2 version

If you need to build ExtendJ with a custom build of JastAdd2, you can place a new jastadd2.jar file in the tools directory in ExtendJ and update build.gradle to add the following parts inside the subprojects block:

repositories {
  flatDir { dirs rootProject.file("tools") }

dependencies {
  jastadd2 name: "jastadd2"

An alternative method is to install a new version of JastAdd2 to your local Maven repository and point to the relevant local Maven version. For example, like this:

repositories {

dependencies {
  jastadd2 "org.jastadd:jastadd:2.3.5"


Command-line synopsis for running a compiled version of ExtendJ:

java JavaCompiler <options> <source files>
  -verbose                  Output messages about what the compiler is doing
  -classpath <path>         Specify where to find user class files
  -sourcepath <path>        Specify where to find input source files
  -bootclasspath <path>     Override location of bootstrap class files
  -extdirs <dirs>           Override location of installed extensions
  -d <directory>            Specify where to place generated class files
  -nowarn                   Disable warning messages
  -help                     Print a synopsis of standard options
  -version                  Print version information


ExtendJ is intended to be an extensible compiler. By using JastAdd to build ExtendJ, you can modify nearly anything through an extension. Since nearly every core part of the compiler is extendable, extensions become fragile: nearly any change to the core compiler can affect extensions.

ExtendJ is also constantly evolving. We frequently redesign parts of the compiler to fix bugs and improve maintainability. Any bug fix in ExtendJ has the potential to affect extensions.

If you want to develop an extension for ExtendJ, we recommend that you stick to using a single commit of ExtendJ to build your extension. Only update to a new version of ExtendJ if you have a good test suite that can ensure that the extension keeps working.

See the extension migration guide for more information about migrating an extension from an older version of ExtendJ to the latest development version.


For new ExtendJ developers, we recommend that you look at the ExtendJ website (, in particular the Getting Started Guide.

Some useful scripts for ExtendJ development can be found at the JJScripts repository.

Coding Style

If you want to submit a patch to ExtendJ, please follow our code style guide.


In the case that ExtendJ generates faulty bytecode there are a number of different tools that can be used to diagnose the problem.

javap can be used to disassemble compiled bytecode:

$ javap -verbose -c Test.class

ASM by OW2 Consortium can be used for advanced instrumentation and analysis of bytecode. There is also a useful plugin for eclipse called "Bytecode Outline" from OW2.


This is a mirror of the main Bitbucket repository. Issue tracking is done on Bitbucket







No packages published