문제
자바11 자바17 버전업을 진행하니 사용하고 있던 나이스아이디 모듈에서 SunJCE 모듈에 접근할 수 없다는 다음과 같은 에러가 발생했다.
cannot access class com.sun.crypto.provider.SunJCE (in module java.base) because module java.base does not export com.sun.crypto.provider to unnamed module @0x4562e04d
java.lang.IllegalAccessError: class NiceID.Check.CPClient (in unnamed module @0x4562e04d) cannot access class com.sun.crypto.provider.SunJCE (in module java.base) because module java.base does not export com.sun.crypto.provider to unnamed module @0x4562e04d
at NiceID.Check.CPClient.<init>(CPClient.java:84)
at io.barogo.oauth.service.certification.NicePhoneVerificationService.getExternalRequestPhoneVerification(NicePhoneVerificationService.java:43)
at io.barogo.oauth.view.v1.CertificationViewController.getPhoneVerificationPage(CertificationViewController.java:47)
at io.barogo.oauth.view.v1.CertificationViewController$$FastClassBySpringCGLIB$$f535edf8.invoke(<generated>)
해결
여기저기 서치해본 결과 해당 모듈이 java17 에서 사라진 건 아니고
Java 17에서도 com.sun.crypto.provider.SunJCE 모듈이 존재하지만 이 모듈은 sun.security.provider.Sun 모듈에 속하고 있으며, Java 모듈 시스템에서 비공개 모듈로 표시되어 있기 때문임을 알 수 있었다.
정상적으로 해당 모듈을 사용할 수 있도록 하기위해선 다음 3가지 방법을 선택해서 해결할 수 있다.
1. intellij VM 옵션 사용
Edit Configuration Setting
에서 VM 옵션 설정
--add-exports=java.base/com.sun.crypto.provider=ALL-UNNAMED
2. gradle 에 옵션 추가
compileJava {
options.compilerArgs += ["--add-exports=java.base/com.sun.crypto.provider=ALL-UNNAMED"]
}
여러명이 공동으로 사용하는 레포인 경우 build.gradle 에 추가하는 것이 제일 좋은 방법이라고 생각되는데 왜인지 이 방법이 적용되지 않는다ㅠㅠ 그래서 어쩔 수 없이 3번 방법으로 적용하고 Readme 에 로컬에서 적용하는 방법을 써두었다. 왜 적용이 되지 않았는가에 대해서는 따로 알아봐야겠다.
참고: https://github.com/gradle/gradle/issues/22453
3. Dockerfile 에 옵션 추가
ENTRYPOINT ["java", "--add-exports", "java.base/com.sun.crypto.provider=ALL-UNNAMED", "-jar", "/app.jar"]
생각
공개모듈이 비공개모듈로 바뀐데에는 안정성, 보안 등을 개선하기 위함인 것 같은데 이렇게 처리하는 것은 딱히 좋은 해결방법이 아닌 것 같다. 역시 버전업은 좀 더 신중하게 진행해야하는 것 같다.
'Error 보고서' 카테고리의 다른 글
[heroku] access denied error (0) | 2020.06.18 |
---|