Fact-checked by Grok 2 weeks ago

javac

Javac is the reference compiler for the Java programming language, a command-line tool included in the Java Development Kit (JDK) that reads source files containing module, package, and type declarations written in Java and compiles them into bytecode class files suitable for execution on the Java Virtual Machine (JVM). It processes .java files into .class files, organizing output based on package structures and supporting features like annotation processing to generate additional code or perform validations during compilation. Developed initially by as part of the original release in 1995, javac has evolved into an open-source project maintained by the Compiler Group, comprising developers focused on its design, , and ongoing enhancements. A pivotal advancement occurred with JDK 1.3, when Odersky's GJ compiler formed the basis for javac, enabling future for generics (introduced in JDK 5.0) and other language extensions. Since Oracle's acquisition of Sun in 2010, javac remains the authoritative for SE, with continuous updates aligned to new language specifications, such as modules in JDK 9 and in later releases. Key aspects of javac include its extensibility through the Java Compiler API (javax.tools), which allows programmatic invocation and integration into build tools, and over 50 command-line options for fine-grained control, such as -d for specifying output directories, --release for targeting specific Java SE versions, and -Xlint for enabling detailed warnings. It supports cross-compilation to ensure compatibility with older JVMs, implicit loading of source files for dependency resolution, and environment variables like JDK_JAVAC_OPTIONS (introduced in JDK 9) for default argument injection. As the standard tool for Java development, javac plays a central role in transforming human-readable into platform-independent , facilitating the portability and that define applications.

Introduction

Definition and Purpose

javac is the standard command-line compiler for the Java programming language, distributed as part of the Java Development Kit (JDK). It takes source code files with the .java extension, which contain declarations for classes, interfaces, enums, and modules, and translates them into platform-independent bytecode. This process enables the creation of executable components that adhere to the Java type system and semantics. The output of javac consists of .class files, each representing the bytecode for a specific class or interface, which the Java Virtual Machine (JVM) can load and execute on any supported platform without requiring recompilation. This bytecode format ensures portability across diverse hardware and operating systems, a core principle of Java's "write once, run anywhere" philosophy. Developed as the of the , javac serves to validate and demonstrate compliance with the (JLS), supporting editions up to JLS 25 as of Java SE 25. Its role in defining expected compiler behavior makes it the benchmark for other s. In contrast to interpreters that execute source code line-by-line or just-in-time (JIT) compilers that generate native machine code dynamically during program execution, javac performs ahead-of-time (AOT) compilation to intermediate bytecode. This separation allows for static analysis and optimization at compile time, while deferring final machine code generation to the JVM's runtime environment, which may interpret the bytecode or apply JIT compilation to hot paths for performance.

Role in Java Development

Javac serves as the of the and the standard tool for compiling into for applications, libraries, and modules in the Java development lifecycle. It is commonly invoked directly from the command line for simple projects or integrated into tools such as , which uses javac by default via its to transform source files during the build process; , where the Java plugin leverages the JDK's javac for compilation tasks; and , which includes a dedicated task to handle source tree compilation. This integration allows developers to automate the compilation step within larger workflows, ensuring across environments. In integrated development environments (IDEs), javac or its derivatives facilitate real-time compilation and error detection during coding. For instance, employs javac as its default compiler for projects, supporting background builds and optimizations. primarily uses its own Eclipse Compiler for (ECJ), a javac-compatible fork, for incremental compilation in the workspace. , through the Language Support for by extension, can utilize javac for compilation in certain configurations, particularly with recent updates enabling partial javac support alongside Eclipse JDT. These integrations enable seamless editing, testing, and deployment cycles by handling compilation transparently in the background. In enterprise Java settings, javac plays a crucial role in producing platform-independent bytecode that maintains consistency across diverse Java Virtual Machine (JVM) implementations, such as Oracle's , IBM's , and Oracle's , as defined by the Specification. This ensures that compiled artifacts execute predictably regardless of the underlying runtime, supporting heterogeneous deployments in cloud and on-premises environments without recompilation. Javac further enhances development efficiency through support for incremental compilation, where only modified source files and their dependencies are recompiled, accelerating build times in large-scale projects when managed by build tools. Additionally, it facilitates cross-compilation to target older JVM versions, such as Java 8, allowing modern development environments to produce compatible for legacy systems. The resulting class files form the portable output that integrates with the broader ecosystem for execution on any compliant JVM.

History

Origins at Sun Microsystems

The javac compiler originated in 1995 as part of Sun Microsystems' Project Green, led by James Gosling and his team, who initially designed it to compile code for the Oak programming language intended for consumer electronics devices. The project evolved when Oak was renamed Java to avoid trademark issues, shifting focus toward a more general-purpose language with emphasis on network computing and portability. This early development phase involved implementing the compiler in C initially by Gosling, before Arthur van Hoff rewrote it in Java itself to ensure strict compliance with the emerging language specification. Javac's first public release occurred alongside the (JDK) 1.0 on January 23, 1996, providing core compilation support for foundational Java elements such as applets, threads, and the (AWT) for graphical user interfaces. As a proprietary tool under Sun's control, javac enabled developers to translate Java source files into executable on the (JVM), laying the groundwork for cross-platform deployment. A significant early advancement came with JDK 1.1 in February 1997, where javac gained support for new language constructs like inner classes and the (JDBC) API, alongside enhancements to error reporting for better developer diagnostics during compilation. A major redesign occurred with JDK 1.3 in 2000, where the javac was rebuilt based on Martin Odersky's (Generic Java) . Although generics were not enabled until JDK 5.0 in 2004, this foundation allowed for the prototyping of parameterized types via JSR 14 in subsequent releases, including the -target jsr14 option in JDK 1.4. Throughout the proprietary period up to JDK 1.4 in February 2002, javac versions remained tightly integrated with releases, including experimental planning for generics via the -target jsr14 option as part of JSR 14, which prototyped parameterized types without full . From its inception, javac prioritized conceptual simplicity in its multi-phase compilation process—parsing, attribution, flow analysis, and code generation—to produce portable bytecode, embodying Sun's "write once, run anywhere" philosophy that distinguished Java from platform-specific languages of the era.

Transition to OpenJDK

In 2006, Sun Microsystems initiated the open-sourcing of key Java components, including the javac compiler, under the GNU General Public License version 2 (GPLv2) with the Classpath exception, which permits linking with non-GPL code. This effort culminated in the official announcement of the OpenJDK project on November 13, 2006, integrating javac as a core element of the open-source reference implementation for the Java Platform, Standard Edition (Java SE). The release of javac's source code by the end of 2006 marked a pivotal shift from proprietary development to community-driven contributions. Oracle's acquisition of Sun Microsystems, completed in January 2010 for $7.4 billion, transferred stewardship of and javac to . Despite this change, the project maintained its open-source ethos, with ongoing community involvement through the governance model, including contributions to language enhancements like via Project Amber. This collaborative framework has sustained javac's evolution, fostering contributions from developers worldwide. Significant milestones in javac's development under include the full alignment achieved with JDK 7, released on July 28, 2011, which represented the first complete open-source Java SE implementation. JDK 9, released in September 2017, introduced modular support in javac, enabling compilation of modules via the --module-path option as part of the (JPMS). In JDK 21, released on September 19, 2023, javac gained support for virtual threads, a lightweight concurrency feature that enhances scalability in server applications. As of 2025, javac's development continues exclusively within the repositories, hosted on platforms like under the OpenJDK organization, with biannual feature releases—such as JDK 25 in September 2025—and (LTS) versions every two years. The transition to this open, collaborative model has enabled innovative features, including ahead-of-time (AOT) compilation hints through Project Leyden, which aims to reduce startup times and footprints by precomputing application condensers.

Compilation Mechanics

Core Phases

The javac compiler processes Java source code through a series of core phases that transform input files into an suitable for further analysis and eventual generation. These phases collectively ensure syntactic validity, semantic correctness, and compliance with the Java language rules before any code emission occurs. Operating primarily on abstract syntax trees (ASTs), the process begins with the source and progresses through symbol resolution, type checking, validation, and syntactic transformation. Parsing initiates the compilation by performing and syntax tree construction. The scanner tokenizes the source code, handling Unicode escapes and producing a stream of tokens according to the Java grammar defined in the (JLS). The parser then builds an using subtypes of JCTree, which represent the hierarchical structure of the code while adhering to the JLS syntactic rules for declarations, expressions, and statements. This phase detects basic syntax errors, such as mismatched braces or invalid keywords, ensuring the input conforms to the language's grammar before proceeding. Following parsing, the enter phase populates the symbol table by processing the AST to register classes, methods, fields, and other entities into scopes. This occurs in two sub-steps: first, recursively entering top-level class symbols and marking them for completion; second, on-demand completion where supertypes, interfaces, and member symbols are resolved and added to the table. The attribution phase then builds upon this by performing type checking and semantic analysis, resolving references to symbols, inferring types for expressions, and verifying compatibility with the JLS type system. It annotates the AST with type information and flags errors like undeclared variables or type mismatches, often using auxiliary checks for constant expressions and overload resolution. After attribution, the check phase performs final semantic validations to ensure overall correctness. The TransTypes phase then translates types, including erasure of generic types to raw types, and generates necessary bridge methods to maintain compatibility and polymorphism. Together, enter, attribution, check, and TransTypes establish a complete, type-safe understanding of the program's structure. Flow analysis examines the AST for control and data flow properties to enforce definite assignment rules, reachability constraints, and validity of exception handling. It traverses the tree to determine whether variables are guaranteed to be initialized before use, identifies unreachable code, and validates try-catch-finally blocks against the JLS requirements for exception propagation and control transfer. This phase ensures the program's behavior aligns with specified semantics, preventing runtime errors like uninitialized variable access. Post-flow analysis, the desugaring phase (also known as lowering) translates high-level language constructs into lower-level equivalents within the , removing while preserving semantics. For instance, expressions are desugared into invokedynamic instructions that defer binding to runtime, enabling dynamic method handles as per the functional interface rules. Other transformations include converting foreach loops to iterator-based code. Bridge methods, synthetic additions that map generic signatures to raw types after , are also synthesized here to preserve polymorphism in subclass overrides, allowing generic classes to interoperate with legacy code without violating . This step simplifies the for subsequent processing, ensuring all features map to core JVM instructions without altering observable behavior. Throughout these phases, javac maintains and modifies ASTs as the central , progressively enriching them with semantic details to guarantee correctness before bytecode emission in later stages. This AST-centric approach allows modular , where each phase focuses on specific aspects of validation and transformation without direct manipulation.

Output Generation

The output generation phase of the javac compiler translates the analyzed abstract syntax tree (AST) into JVM bytecode instructions, constructing the essential components of class files. This process, handled primarily by the Gen class, generates Code attributes for method bodies, which contain sequences of bytecode instructions executable by the JVM. Simultaneously, the constant pool is built using the Pool class to store literals, symbolic references, and other constants referenced throughout the class file, ensuring efficient resolution during runtime loading. During , javac applies targeted optimizations to refine the . These include inline expansions for certain constructs like constant expressions and basic to remove unreachable statements identified after flow analysis. These optimizations occur within the Gen phase and the preceding Lower phase, focusing on structural simplifications rather than aggressive runtime profiling. The resulting output consists of .class files containing the bytecode along with metadata attributes, such as the Signature attribute for generic type information accessible via reflection APIs. Since JDK 9, javac can generate classes for specific Java releases using options like --release, which can then be organized into multi-release JAR structures (e.g., META-INF/versions/) to provide compatible bytecode for multiple Java platform releases. For modular code, javac produces a module-info.class file encoding directives like exports and requires, which define module boundaries and dependencies in the JVM's module system. The generated bytecode is designed to be verifiable, passing the JVM's type safety checks to prevent runtime errors like invalid casts or array accesses, as ensured by javac's conformance to the class file format.

Usage and Options

Basic Command-Line Syntax

The javac command is invoked from the command line with the basic syntax javac [options] [sourcefiles-or-classnames] [@files], where sourcefiles-or-classnames specifies one or more paths to Java source files (typically ending in .java) or fully qualified class names (e.g., com.example.MyClass) for the compiler to process, and @files refers to optional argument files containing lists of additional source files or options to simplify long command lines. This form allows for flexible invocation, supporting both single-file compilation and of multiple source files in a single run. For example, to compile a simple source file named HelloWorld.java, the command javac HelloWorld.java is used, which generates the corresponding file HelloWorld.class in the current directory, assuming no errors in the source code. The javac tool requires a (JDK) installation to function, as it is bundled with the JDK rather than the Java Runtime Environment (JRE). To verify the version, the command javac --version displays the compiler's version, which corresponds directly to the installed JDK version—for instance, it outputs javac 25.0.1 when using JDK 25. When dependencies are involved, the can be specified using the -cp or --class-path option to indicate directories, files, or ZIP archives where the compiler should search for user classes and annotation processors; for example, javac -cp /path/to/libs HelloWorld.java compiles HelloWorld.java while resolving references from the specified path. This mechanism enables javac to handle compilations in environments with external libraries without altering the default system .

Key Compiler Flags

The javac compiler provides several key command-line options that allow developers to customize the process, such as specifying output locations, managing dependencies, controlling language compatibility, and enabling diagnostic output. These flags are essential for tailoring builds to specific environments, ensuring compatibility across versions, and compilation issues. The -d option specifies the destination for the generated files. When provided, javac places the output .class files in the designated directory, creating subdirectories as needed to reflect the package of the compiled classes. For example, compiling a file in package com.example would result in the class file being placed at directory/com/example/. If omitted, class files default to the same directory as their corresponding source files. This flag is particularly useful in build scripts to separate source and outputs. Classpath management is handled by the -cp, --class-path, or -classpath options, which define the search path for user class files, annotation processors, and other dependencies during compilation. These options override the CLASSPATH environment variable and accept a colon-separated (on Unix-like systems) or semicolon-separated (on Windows) list of directories, JAR files, or ZIP archives. For instance, javac -cp lib.jar:classes MyClass.java instructs the compiler to look in lib.jar and the classes directory for imported types. By default, if no classpath is specified, javac uses the value of CLASSPATH or the current directory. This ensures that external libraries are accessible without relying on system-wide settings. To control the source language level, option specifies the Java SE release against which the source code should be compiled, enabling or restricting features accordingly. Supported values include the current release and prior versions, such as -source 8 to compile using only Java 8 language features like lambda expressions while avoiding newer syntax. The default is the current Java SE release version of the running javac. This flag is crucial for maintaining compatibility when targeting older development environments or enforcing stricter feature subsets. Bytecode compatibility is governed by the -target option, which generates class files suitable for the specified release, determining the minimum JVM version required to run the output. For example, -target 11 produces compatible with JVM 11 or later, potentially using instructions unavailable in earlier versions. Since JDK 9, the default release matches the version of the javac compiler itself, and it must be equal to or higher than the source release to prevent generation of unverifiable code. This ensures while allowing explicit downgrades for systems. The --release option provides a convenient way to set both the source and target releases to a specific SE version, ensuring consistent compatibility without specifying -source and -target separately. For example, --release 17 compiles the source code as if using JDK 17 for both language features and bytecode generation, automatically handling the appropriate settings and including relevant modules. This flag, introduced in JDK 9, simplifies multi-version builds and is recommended for targeting older platforms. Diagnostic and logging capabilities are enhanced by options like -verbose, which outputs detailed messages about the compilation process, including each loaded from the and each file processed. This mode is invaluable for dependency resolution or verifying compilation steps in complex builds. Additionally, the -Xlint:deprecation suboption of -Xlint enables warnings for the use of deprecated or features, equivalent to the legacy -deprecation flag, helping developers identify and migrate away from outdated code elements during compilation. These options promote better code maintenance without altering the core output.

Advanced Capabilities

Annotation Processing

Javac's annotation processing capability enables the generation and modification of during based on in source files. This feature was introduced with the Annotation Processing Tool (apt) in JDK 5 in September 2004, providing a for using the javax.annotation.processing and javax.lang.model APIs. In JDK 6, released in December 2006, apt was fully integrated into javac, eliminating the need for a separate tool and allowing seamless invocation during standard . This integration supports pluggable annotation processors that can analyze, generate, or transform , enhancing developer productivity by automating repetitive tasks. Annotation processors are discovered automatically by javac during compilation. The compiler scans the processor path—specified via the -processorpath option or defaulting to the classpath—for classes implementing the Processor interface and annotated with @SupportedAnnotationTypes. This meta-annotation declares the specific annotation types (e.g., "com.example.MyAnnotation") that the processor handles, allowing javac to invoke only relevant processors for efficiency. Users can override automatic discovery by explicitly listing processors with the -processor option, such as -processor com.example.MyProcessor. The processing occurs in iterative rounds to handle dependencies between generated code. In each round, javac collects program elements (e.g., classes, methods) annotated with supported types and passes them to the corresponding processors via the ProcessingEnvironment. Processors can then use the Filer to generate new source files (.java) or class files (.class), query the with javax.lang.model elements, and report diagnostics (errors, warnings, notes) through the Messager . If new source files are created, javac compiles them in subsequent rounds until no further changes occur, after which the final compilation of all elements proceeds. The -XprintRounds option can be used to log these rounds for . Processing modes are controlled by the -proc option: none disables processing entirely, only runs processing without subsequent compilation (useful for code generation alone), and full (the default) performs both. Additional processor-specific options can be passed via -Akey[=value], such as configuring warning levels. A prominent example is Project Lombok, which leverages javac's annotation processing to eliminate ; annotations like @Data trigger the generation of getters, setters, toString, equals, and hashCode methods at . This approach reduces verbosity while maintaining standard output compatible with any runtime.

Modular and Multi-Release Support

Javac's support for the (JPMS), introduced in Java 9 as part of , enables the compilation of modular Java code by processing module declarations in module-info.java files and enforcing module boundaries during compilation. To compile a module, javac uses the --module-path option to specify directories or JAR files containing modules, replacing the traditional for modular awareness; for example, javac --module-path mods -d out src/modules/com.example.app/module-info.java src/modules/com.example.app/com/example/app/Main.java compiles the com.example.app module and places outputs in a structure mirroring the input module layout. The --module-source-path option further allows specification of source module locations, facilitating multi-module projects where javac automatically resolves dependencies and selects the best available module versions based on readability declarations in module-info.java. This modular compilation integrates with the runtime by generating module-info.class files that define exports, requires, and other descriptors, ensuring and encapsulation at ; legacy non-modular code can still be compiled using --classpath and --sourcepath, but modular mode provides stronger encapsulation checks, such as preventing access to internal APIs. also supports patching modules via --patch-module, allowing overrides of specific packages during compilation for testing or customization, as in javac --patch-module my.module=/path/to/patch src/MyClass.java. Complementing modular support, javac facilitates multi-release JAR files, a Java 9 feature defined in JEP 238, by compiling classes targeted to specific Java versions using the --release option, enabling a single to contain version-specific for compatibility across JVMs. For instance, to create version-specific classes, compile the base version with javac --release 8 -d classes8 MyClass.java and a higher version with javac --release 11 -d classes11 MyClass.java, which can then be packaged into a multi-release via the jar tool with a Multi-Release: true manifest entry, placing the classes11 output under META-INF/versions/11; javac's JavacFileManager reads these versioned entries during subsequent compilations, selecting the appropriate version based on the target platform. This support extends to analysis tools like jdeps, which javac integrates with to report version-specific dependencies, ensuring libraries can evolve without breaking older deployments.

References

  1. [1]
    The javac Command
    ### Official Description of javac
  2. [2]
    Javac - the Compiler - Dev.java
    Sep 14, 2021 · The javac command reads class and interface definitions, written in the Java programming language, and compiles them into bytecode class files.Description · Implicitly Loaded Source Files · Extra Options
  3. [3]
    The Java programming language Compiler Group - OpenJDK
    This group is comprised of developers involved in the design, implementation, and maintenance of the javac compiler for the Java programming language.
  4. [4]
    Preface to the Third Edition - Oracle Help Center
    Martin Odersky implemented the GJ compiler, and his implementation became the basis for javac (starting with JDK 1.3, even though generics were disabled until ...
  5. [5]
    javac README - OpenJDK
    The compiler is a program for compiling source code written in the Java programming language into class files suitable for execution on a Java virtual machine.Files and Directories · Specifications · Building the compiler
  6. [6]
    The javac Command
    ### Summary of javac from Oracle Java SE 23 Documentation
  7. [7]
    The Java Programming Language Compiler, javac
    The Java programming language compiler, javac, reads source files written in the Java programming language, and compiles them into bytecode class files.
  8. [8]
  9. [9]
    Java And The Java Runtime Environment (JRE)
    The JIT compiler then compiles the bytecodes into native code for the platform on which it is running. The next figure illustrates the JIT compile process.
  10. [10]
    The javac Command - Oracle Help Center
    The javac command reads source files that contain module, package and type declarations written in the Java programming language, and compiles them into class ...Missing: bytecode openjdk.
  11. [11]
    Javac Task - Apache Ant
    Javac. Description. Compiles a Java source tree. The source and destination directory will be recursively scanned for Java source files to compile.
  12. [12]
    Java Compiler | IntelliJ IDEA Documentation - JetBrains
    Oct 31, 2024 · IntelliJ IDEA comes bundled with the Eclipse compiler. Groovy-Eclipse. This compiler lets you perform joint compilation of Groovy and Java code ...
  13. [13]
    Announcing Javac support in Visual Studio Code Java
    Dec 12, 2024 · Hi everyone, we are pleased to announce partial support of Javac as the underlying compiler in Visual Studio Code Java, JDT, and JDT-LS.
  14. [14]
    javac - Oracle Help Center
    If you are cross-compiling, then this option specifies the directories that contain the extension classes. See Cross-Compilation Options for javac. Note.
  15. [15]
    A Brief History of the Java Programming Language - Baeldung
    Apr 19, 2024 · Ultimately, it was James Gosling, one of the members of the Green Project, who originated this new language, which he called Oak. Afterward ...
  16. [16]
  17. [17]
    Introduction-Learn Java Really
    JDK Versions ; JDK 1.0, Jan 23, 1996, Oak, Java 1.0 is offi cially released,consisting a few hundred classes. ; JDK 1.1, Feb 19, 1997, -, JDBC, Inner Classes, RMI ...
  18. [18]
    1.2. The Java Virtual Machine
    The Java platform was initially developed to address the problems of building software for networked consumer devices. It was designed to support multiple host ...
  19. [19]
    java compiler's target version "jsr14" with JDK7/8 - Stack Overflow
    Oct 30, 2010 · We are heavily using -jsr14 in OSGi because it allows us to use generics in our API but still deploy on 1.4 environments, which are still ...Missing: planning | Show results with:planning
  20. [20]
    Compilation Overview - OpenJDK
    The process of compiling a set of source files into a corresponding set of class files is not a simple one, but can be generally divided into three stages.
  21. [21]
    Compiler Package Overview - OpenJDK
    Primary processing phases for the compiler, such as attribution, flow analysis, "desugaring" and erasure. file: Access to the native file system, including the ...
  22. [22]
    The Hitchhiker's Guide to javac - OpenJDK
    Compiler Package Overview for an overview of the javac package structure; Compilation Overview for an overview of the compilation pipeline. Functional blocks.Missing: phases | Show results with:phases
  23. [23]
    Effects of Type Erasure and Bridge Methods (The Java™ Tutorials ...
    The following example shows how a compiler sometimes creates a synthetic method, which is called a bridge method, as part of the type erasure process.
  24. [24]
    Compile-time optimizations in Java - Fekir's Blog
    Mar 7, 2022 · The Java compiler javac does generally not optimize code, except in very specific situations. It can do constant folding, like replacing 3+5 with 8.Missing: bridge | Show results with:bridge
  25. [25]
    Chapter 4. The class File Format - Oracle Help Center
    This chapter describes the class file format of the Java Virtual Machine. Each class file contains the definition of a single class, interface, or module.
  26. [26]
    JEP 238: Multi-Release JAR Files - OpenJDK
    Jun 18, 2014 · A multi-release JAR ("MRJAR") will contain additional directories for classes and resources specific to particular Java platform releases.
  27. [27]
    The javac Command - Oracle Help Center
    The javac command reads source files that contain module, package and type declarations written in the Java programming language, and compiles them into class ...
  28. [28]
    JEP 136: Enhanced Verification Errors - OpenJDK
    Nov 30, 2011 · Bytecodes are verified by the JVM's bytecode verifier. Bytecodes emitted by the JDK's javac compiler generally result in highly conformant ...
  29. [29]
    Getting Started with the Annotation Processing Tool (apt)
    What is apt? The command-line utility apt , annotation processing tool, finds and executes annotation processors based on the annotations present in the set ...Missing: JDK | Show results with:JDK
  30. [30]
    Processing Code - OpenJDK
    Prior to JDK 5.0, the only supported way to examine the structure and comments of Java classes was by using javadoc and the original Doclet API. JDK 5.0. In JDK ...
  31. [31]
    javax.annotation.processing (Java SE 17 & JDK 17)
    ### Summary of javax.annotation.processing Package
  32. [32]
    Lombok Execution Path
    LombokProcessor is the 'real' annotation processor that does the work of transforming your code. code transformation is fundamentally a cyclic concept: To ...
  33. [33]
    [PDF] Modules and javac | OpenJDK
    required module. – javac delegates to the Jigsaw module system to select the "best" available version of each and every module required by M. ○. The "magic ...