Spring/error

Java 17에서 LocalDateTime 이슈

비뀨_ 2024. 12. 26. 17:45

Java : 17

Spring boot : 3.3.2

Spring Data MongoDB : 4.3.2

 

에서 다음과 같은 오류가 발생했다.

더보기

Unable to make private java.time.LocalDateTime(java.time.LocalDate,java.time.LocalTime) accessible: module java.base does not "opens java.time" to unnamed module @3ec89225 at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) at java.base/java.lang.reflect.Constructor.checkCanSetAccessible(Constructor.java:189) at java.base/java.lang.reflect.Constructor.setAccessible(Constructor.java:182) at org.springframework.util.ReflectionUtils.makeAccessible(ReflectionUtils.java:201) at

... 생략

 

먼저

Unable to make private 
java.time.LocalDateTime(java.time.LocalDate,java.time.LocalTime) accessible: 
module java.base does not "opens java.time" to unnamed module

 

이 부분은 LocalDateTime의 생성자에 대한 접근 제어 문제 때문에 일어난 문제다.

 

java.time.LocalDateTime 클래스는 Java 17부터 기본적으로 모듈화가 적용되어 있고

java.base 모듈이 다른 모듈에 대해 java.time 패키지를 사용하지 열지 않기 때문에

checkCanSetAccessible메서드를 이용하여 접근 가능 여부를 체크하지만 

리플렉션을 사용하여 해당 생성자에 접근할 수 없기 때문에 발생하는 오류이다.

 

해결방법은 간단한데 

 

build.gradle 파일에

tasks.named('bootRun') {
    jvmArgs = ['--add-opens', 'java.base/java.time=ALL-UNNAMED']
}

 

해당 부분을 추가하면 java.time 패키지를 열어줄 수 있다.