Java-16과 호환되지 않는 jdk.compiler의 내부 패키지에 대한 Lombok의 액세스

나만

내 프로젝트 중 하나를 Java-15에서 16으로 업그레이드하기 만하면됩니다 ( 여기 에서 최신 빌드 사용 ). 다음과 같이 lombok을 사용하는 프로젝트를 컴파일 할 때 :

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

나는 스택 추적에 약간 갇혀있다.

Caused by: java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed module @0x4e670245) 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 @0x4e670245
    at lombok.javac.apt.LombokProcessor.getJavacProcessingEnvironment (LombokProcessor.java:433)
    at lombok.javac.apt.LombokProcessor.init (LombokProcessor.java:92)
    at lombok.core.AnnotationProcessor$JavacDescriptor.want (AnnotationProcessor.java:160)
    at lombok.core.AnnotationProcessor.init (AnnotationProcessor.java:213)
    at lombok.launch.AnnotationProcessorHider$AnnotationProcessor.init (AnnotationProcessor.java:64)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment$ProcessorState.<init> (JavacProcessingEnvironment.java:702)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors$ProcessorStateIterator.next (JavacProcessingEnvironment.java:829)

이제 적어도 내가이 문제를 해결하기위한 해킹을 알고 있다고 생각했지만 다음 구성을 시도해도 maven-compiler-plugin

<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>-->
        <compilerArgs>
            <arg>--enable-preview</arg>
            <arg>-Xlint:all</arg>
            <arg>--add-exports=jdk.compiler/com.sun.tools.javac.processing=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>

누구든지이 문제를 해결할 수 있었습니까?

편집 : 주석 에서 Jorn이 제공하는 링크는 GitHub의 동일한 문제와 관련이 있지만 제안 된 솔루션은 여전히 ​​실제로 작동하지 않습니다. 다음 인수도 추가했습니다.

<arg>--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>
<arg>--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>
<arg>--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>
<arg>--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>
<arg>--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>
<arg>--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>
<arg>--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
<arg>--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>
<arg>--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>
존 버니

최신 JDK-16 빌드에서 볼 수있는 예외는 JEP 396 : Strongly Encapsulate JDK Internals by Default 때문 입니다. Lombok은 리플렉션을 사용하여 내부 JDK API에 액세스하고 있으며, 이전 Java 버전에서는 경고 메시지가 표시되었지만 이제는 하드 오류가 발생합니다.

전달하여 자바를 실행할 때 일반적으로, 반사에 대한 명시 적으로 개방 내부 JDK 패키지에 수 --add-opens=<module>/<package>=<accessing module>실행할 때 VM 인수로 지시를 java. 이 경우 이러한 지시문 java은를 호출 할 때 실행 되는 프로세스 로 전달되어야합니다 javac. 이는 전달 된 옵션 앞에 javacwith 를 붙여서 수행 할 수 있으며 -J, 대신 기본 JVM에 전달합니다.

Maven을 사용하여 다음 컴파일러 플러그인 구성으로 작동하도록 만들 수있었습니다.

<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>

<compilerArgs>구성의 요소를 사용하여 필요한 옵션이 전달 되는 위치입니다.

-J옵션 javac대신에 JVM 실행에 전달하기 위해 옵션 앞에 추가 했습니다 javac.

의 상단에 --add-opens질문 추가에 나와있는 지침 :

-J--add-opens=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED

또한 필요했습니다.

<fork>true</fork>그렇지 않으면 -J옵션이 무시되었으므로 (의 출력으로 판단 mvn clean install -X) 필요했습니다. Maven 문서 forktrue보면 다음을 사용할 때 언제든지 설정 이 필요한 것으로 보입니다 <compilerArgs>.

https://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#compilerArgs

<compilerArgs>가로 fork설정된 경우 컴파일러에 전달할 인수를 설정합니다 true.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

어떻게 이클립스의 내부 Java 패키지에 액세스 할 수 있도록하려면?

분류에서Dev

지역 내부 클래스에서 외부 개체에 대한 모의 액세스

분류에서Dev

설치된 Android에서 동일한 패키지 이름 및 동일한 키의 새 앱에 기존 앱의 로컬 저장소에 대한 액세스 권한을 부여하는 방법

분류에서Dev

함수 호출 내부 또는 실행되지 않는 clojure의 문에 대한 테스트

분류에서Dev

노드 패키지의 창에 액세스하는 방법

분류에서Dev

react-select의 내부 입력 요소에 대한 액세스

분류에서Dev

다른 div 내부의 한 div에 액세스하는 방법

분류에서Dev

Redux (React Native)에서 저장소에 대한 디스패치 및 액세스 상태-정의되지 않은 반환

분류에서Dev

AWS에서 호스팅되는 프라이빗 NuGet 패키지 서버가 하나의 NuGet 패키지에 대해 403 Forbidden 오류를 반환합니다.

분류에서Dev

Dictionary 내부의 키에 대한 액세스는 Swift에서 가져옵니다.

분류에서Dev

함수 (Javascript) 내부에있는 배열의 각 요소에 대한 액세스 권한 얻기

분류에서Dev

S3 버킷 내부의 개인 폴더에 액세스하는 사용자를 제외한 모든 사용자에 대한 액세스 거부

분류에서Dev

"org.w3c.dom 패키지는 둘 이상의 모듈에서 액세스 할 수 있습니다 : <unnamed>, java.xml"에 관한 특정 질문

분류에서Dev

Docker : java : 8-jdk-alpine에서 만든 이미지의 Docker 컨테이너에 액세스하는 방법

분류에서Dev

클래스 인수 및 메서드 인수에 대한 액세스 권한을 잃지 않고 클래스의 메서드 내부에서 이벤트 리스너 내에서 "this"키워드를 사용하는 방법은 무엇입니까?

분류에서Dev

행과 열 내부의 요소에 액세스하는 방법

분류에서Dev

HKLM \ System \ CurrentControlSet \ Control \ Class의 레지스트리 키에 대한 액세스 권한 부여

분류에서Dev

Java의 사용자 정의 패키지에서 액세스 방법

분류에서Dev

Java 호환되지 않는 유형의 한 줄 알림 오류

분류에서Dev

패키지 내부의 유성 패키지 이름에 액세스하는 방법은 무엇입니까?

분류에서Dev

jar 외부에서 기본 패키지의 클래스에 액세스

분류에서Dev

NSURL을 사용하여 패키지 내부의 파일 경로에 액세스

분류에서Dev

호출되지 않는 클래스 내부의 함수

분류에서Dev

함수의 관련 테이블에 대한 액세스 권한을 부여하지 않는 GRANT EXECUTE

분류에서Dev

Windows의 모든 코어에 액세스하지 않는 Java 프로세스

분류에서Dev

기본 패키지에서 기본 패키지 내부의 Java 클래스를 가져 오는 방법

분류에서Dev

정의되지 않은 url 및 rootScope에 대한 액세스 보안

분류에서Dev

TypeScript에서 람다 내부의 클래스 범위에 대한 액세스가 정의되지 않았습니까?

분류에서Dev

이미지로로드하기위한 상대 경로를 통한 패키지 외부의 Java 액세스 파일 (JavaFX)

Related 관련 기사

  1. 1

    어떻게 이클립스의 내부 Java 패키지에 액세스 할 수 있도록하려면?

  2. 2

    지역 내부 클래스에서 외부 개체에 대한 모의 액세스

  3. 3

    설치된 Android에서 동일한 패키지 이름 및 동일한 키의 새 앱에 기존 앱의 로컬 저장소에 대한 액세스 권한을 부여하는 방법

  4. 4

    함수 호출 내부 또는 실행되지 않는 clojure의 문에 대한 테스트

  5. 5

    노드 패키지의 창에 액세스하는 방법

  6. 6

    react-select의 내부 입력 요소에 대한 액세스

  7. 7

    다른 div 내부의 한 div에 액세스하는 방법

  8. 8

    Redux (React Native)에서 저장소에 대한 디스패치 및 액세스 상태-정의되지 않은 반환

  9. 9

    AWS에서 호스팅되는 프라이빗 NuGet 패키지 서버가 하나의 NuGet 패키지에 대해 403 Forbidden 오류를 반환합니다.

  10. 10

    Dictionary 내부의 키에 대한 액세스는 Swift에서 가져옵니다.

  11. 11

    함수 (Javascript) 내부에있는 배열의 각 요소에 대한 액세스 권한 얻기

  12. 12

    S3 버킷 내부의 개인 폴더에 액세스하는 사용자를 제외한 모든 사용자에 대한 액세스 거부

  13. 13

    "org.w3c.dom 패키지는 둘 이상의 모듈에서 액세스 할 수 있습니다 : <unnamed>, java.xml"에 관한 특정 질문

  14. 14

    Docker : java : 8-jdk-alpine에서 만든 이미지의 Docker 컨테이너에 액세스하는 방법

  15. 15

    클래스 인수 및 메서드 인수에 대한 액세스 권한을 잃지 않고 클래스의 메서드 내부에서 이벤트 리스너 내에서 "this"키워드를 사용하는 방법은 무엇입니까?

  16. 16

    행과 열 내부의 요소에 액세스하는 방법

  17. 17

    HKLM \ System \ CurrentControlSet \ Control \ Class의 레지스트리 키에 대한 액세스 권한 부여

  18. 18

    Java의 사용자 정의 패키지에서 액세스 방법

  19. 19

    Java 호환되지 않는 유형의 한 줄 알림 오류

  20. 20

    패키지 내부의 유성 패키지 이름에 액세스하는 방법은 무엇입니까?

  21. 21

    jar 외부에서 기본 패키지의 클래스에 액세스

  22. 22

    NSURL을 사용하여 패키지 내부의 파일 경로에 액세스

  23. 23

    호출되지 않는 클래스 내부의 함수

  24. 24

    함수의 관련 테이블에 대한 액세스 권한을 부여하지 않는 GRANT EXECUTE

  25. 25

    Windows의 모든 코어에 액세스하지 않는 Java 프로세스

  26. 26

    기본 패키지에서 기본 패키지 내부의 Java 클래스를 가져 오는 방법

  27. 27

    정의되지 않은 url 및 rootScope에 대한 액세스 보안

  28. 28

    TypeScript에서 람다 내부의 클래스 범위에 대한 액세스가 정의되지 않았습니까?

  29. 29

    이미지로로드하기위한 상대 경로를 통한 패키지 외부의 Java 액세스 파일 (JavaFX)

뜨겁다태그

보관