Spring Boot : IllegalAccessException : cannot access class … 에러 해결 방법(Intellij)
“IllegalAccessException : cannot access class …” 에러 해결 방법(Intellij)
다양한 라이브러리를 사용하다 보면 IllegalAccessException : cannot access class ...
에러를 마주칠 때가 있습니다.
해당 글은 위 에러를 해결하는 방법에 대하여 기재한 글입니다. (저는 Intellij를 사용했기 때문에 Intellij에서의 해결 방법입니다. 다른 IDE는 비슷한 옵션을,,,)
저의 경우에는 Nice 본인인증 라이브러리를 사용하다 발생하였습니다.
원인
원인을 간략하게 말하자면, JDK 9 이후의 릴리즈에서 sun.misc.Unsafe와 같은 중요한 내부 API를 제외하고 기본적으로 JDK의 모든 내부 요소를 강력하게 캡슐화했기 때문입니다.하지만 이전 버전을 지원하기 위하여 JDK 8에 존재하는 패키지(java.*
, sun.*
등)에 대해 사용자가 캡슐화를 허용할지 말지 선택할 수 있습니다.
대략적으로 읽어봤을 때, 이유는 다른 오픈 라이브러리에서 내부 API를 사용하여 결합도가 높아져 유지보수가 힘들다는 내용인 것 같았습니다. (정확한 내용은 아래 링크를 참고하시면 좋을 것 같습니다.)
- 참고 링크 : https://openjdk.org/jeps/396
해결 방법
–add-exports 사용
기본적으로 액세스할 수 없는 내부 API를 사용해야 하는 경우 –add-exports 명령줄 옵션을 사용하여 캡슐화를 해제할 수 있습니다.
Intellij에서 Run -> Edit Configurations -> Vm options(없다면 상단의 Modify options에서 추가)
에 아래 옵션을 사용할 패키지에 따라 추가해주면 됩니다.
- –add-exports=java.base/com.sun.crypto.provider=ALL-UNNAMED
마치며…
생각보다 간단한 것을 여기 저기 검색하느라 꽤나 시간을 사용하였는데, 다른 분들은 이 글을 보고 시간을 단축시켰으면 합니다.
참고 링크
- https://intellij-support.jetbrains.com/hc/en-us/community/posts/5153987456018-Java-17-cannot-access-class-sun-security-pkcs-PKCS7
- https://openjdk.org/jeps/396
- https://i.imgur.com/j4v0Lcn.jpg
- https://docs.oracle.com/javase/9/migrate/toc.htm#JSMIG-GUID-2C896CA8-927C-4381-A737-B1D81D964B7B
댓글남기기