190

I am somewhat new to coding and am trying to use the Lombok plugin to automatically create Getters/Setters e.t.c. for my fields of a specific class. In doing so I get greeted with the following error:

The error:

java: java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed module @0x3b67ef9b) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.processing to unnamed module @0x3b67ef9b

After doing some searching online, I found out that this error is related to an issue in OpenJDK 15 but I am currently using OpenJDK 16, hence why I am confused that I am still getting this error.

This thread claims to have a solution: https://github.com/rzwitserloot/lombok/issues/2681#issuecomment-748616687 but after implementing the plugin, it does not seem to make any difference and I still receive the error.

I have most likely made a trivial mistake since I am a beginner but if someone knows what I am missing please let me know.

Class Using @Data (Lombok):

import lombok.Data;

@Data
public class Ingredient {

    private final String id;
    private final String name;
    private final Type type;

    public enum Type {
        WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE
    }

}

My Pom File:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>sia</groupId>
    <artifactId>taco-cloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>taco-cloud</name>
    <description>Taco Cloud Project</description>
    <properties>
        <java.version>16</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
halfer
  • 19,824
  • 17
  • 99
  • 186
Dainank
  • 2,142
  • 2
  • 7
  • 14
  • If you are on JDK16 why not using records? If you are a beginner why not using the fundamentals to learn how they work? Lombok is known not working correctly in the published version on JDK16... so you have to wait either a newer version is available or just use plain java ... (IDE can help here a lot...) .... – khmarbaise Mar 25 '21 at 14:14
  • 2
    BTW: can you tell where you found that: `.. is related to an issue in OpenJDK 15`..? – khmarbaise Mar 25 '21 at 14:20
  • @khmarbaise I thought that it was an issue with OpenJDK 15 since this post signified that in the release version of OpenJDK 16 the problem would no longer be present: https://github.com/rzwitserloot/lombok/issues/2681#issuecomment-749000759 but looking back, I think he was simply referring to a beta build of OpenJDK 16? – Dainank Mar 25 '21 at 14:27
  • 2
    Yes JDK16 has closed things which had been left open before (internal things in the JDK) which are being used by Lombok etc. and it was clear for a longer time that the closing will happen.... – khmarbaise Mar 25 '21 at 14:32
  • @khmarbaise I see, thanks for the info. Is there a workaround to still use Lombok in JDK 16 or should I switch to JDK 15 or earlier? – Dainank Mar 25 '21 at 14:37
  • 2
    @khmarbaise As a heads-up, I have opted to remove the Lombok dependency and instead made my Getters, Setters, e.t.c. manually in the code. Got my application to run successfully after that. – Dainank Mar 25 '21 at 14:48
  • 2
    I was getting a similar error doing a maven clean install on mac with open jdk 13. I downgraded the java version to 11 and was able to build the project with no errors. [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project phms-domain: Fatal error compiling: java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor ( – Arv Apr 12 '22 at 20:07
  • In my simple maven project, I am not using lombok still I am getting above error. In IntelliJ I am using another separate Gradle project with lombok. Could that be the cause? – user2451016 Jul 20 '22 at 10:37

3 Answers3

450

Switch to at least the 1.18.22 version of Lombok that contains the fix

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.22</version>
</dependency>

To see the last version of lombok, follow this link on search.maven.org

axiopisty
  • 4,972
  • 8
  • 44
  • 73
FrankyFred
  • 5,272
  • 1
  • 20
  • 19
11

It seems can be solved by adding plugin in pom.xml

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
        <source>16</source>
        <target>16</target>
        <!--                    <release>16</release>-->
        <fork>true</fork>
        <compilerArgs>
            <arg>--enable-preview</arg>
            <arg>-Xlint:all</arg>
            <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>
            <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>
            <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>
            <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>
            <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>
            <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>
            <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
            <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>
            <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>
            <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED</arg>
        </compilerArgs>
        <!--for unmappable characters in classes-->
        <encoding>UTF-8</encoding>
        <showDeprecation>true</showDeprecation>
        <showWarnings>true</showWarnings>
        <!--for lombok annotations to resolve-->
        <!--contradictory to maven, intelliJ fails with this-->
        <annotationProcessorPaths>
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.16</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>

solution from Lombok's access to jdk.compiler's internal packages incompatible with Java-16

Starl1ght
  • 4,422
  • 1
  • 21
  • 49
  • I have attempted to implement this, but receive the following error: ```java: invalid source release 15 with --enable-preview (preview language features are only supported for release 16) ``` I then attempted to use release 16 but then received the original error. – Dainank Mar 30 '21 at 07:40
5

@FrankyFred has provided a temporary solution to be able to use Lombok: https://stackoverflow.com/a/66981165/12586904


As far as my research goes and the various responses that I received to this question, it seems like there is no possible way of running Lombok currently in OpenJDK 16. As such, an alternative to using Lombok is to put the @data methods manually in your code. The following link briefly explains how to do this in case you are new to this topic: https://javabydeveloper.com/lombok-data-annotation/#:~:text=Lombok%20Data%20annotation%20(%20%40Data%20),as%20well%20as%20a%20constructor.

Sample pseudo code representing what @Data really represents:

@Getter @Setter 
@RequiredArgsConstructor
@ToString 
@EqualsAndHashCode
public class User1 {
  private Long id;
  private String username;
  
}

The Lombok @Data annotation minimizes the usage of more annotations when you need to generate all the above seven requirements, but they essentially achieve the same objectives when running the code.

I am by no means an expert at this, but hopefully, this will help anyone else who gets stuck using Lombok but needs to find an alternative since their book/tutorial might utilize it and u would still like to continue with the book/tutorial.

Dainank
  • 2,142
  • 2
  • 7
  • 14