프로젝트에서 인텔리제이의 오른쪽 탭에 있는 gradle 탭을 통해서 clean → build 를 하니 test 쪽에서 오류가 발생하는 경험을 겪었습니다. 이에 대한 트러블 슈팅을 기록하려 합니다.
gradle 탭을 통해서 clean → build를 했을때 발생한 에러 내용은 다음과 같습니다.
error: cannot find symbol
[log.info](http://log.info/)("{로그내용 비밀비밀}", "로그내용 비밀비밀");
symbol: variable log
location: class {클래스이름}
해당 원인에 대해 구글링을 조금 찾아보니 gradle 에 Lombok 에 대한 설정오류라는 내용을 접하게 되었습니다.
그리고 gradle 에 lombok 에 대한 내용을 확인해보니 아래와 같았습니다.
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.projectlombok:lombok'
저는 단순히 testImplementation 만 붙여주고 lombok을 주입받아주면 되는 줄 알았습니다.
하지만 버전에 따른 lombok 에 대한 주입방식이 다른건 예상하지 못한 변수였습니다ㅎ
https://deeplify.dev/back-end/spring/lombok-required-args-constructor-initialize-error
위의 블로그를 통해서 Gradle 버전에 따라서 lombok을 주입받을때 다르게 해줘야한다는 사실을 알게되었습니다..
위의 블로그 내용을 요약하면 다음과 같습니다.
gradle 5.x 미만
dependencies {
implementation 'org.projectlombok:lombok'
}
gradle 5.x 이상
dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}
이렇게 implementation 과 compileOnly, annotationProcessor 이렇게 차이가 있었습니다.
그래서 우선은 적용은 해서 아래와 같이 수정을 진행했습니다.
변경후 gradle
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
test 코드에 대한 lombok 주입도 똑같이 받아주니
[error: cannot find symbol
[log.info](http://log.info/)("{로그내용 비밀비밀}", "로그내용 비밀비밀");
symbol: variable log
location: class {클래스이름}]
아까 위에서 봤던 이 오류에 대한 해결이 되었습니다!
그런데 여기서 궁금한 점이 생겼습니다.
왜 저렇게 바뀌었을까, complieOnly, implementation 의 차이는 뭘까..?
이부분에 대한 궁금증을 해결하기 위해서는 우선 현재 gradle 버전을 확인해야합니다.
그리고 현재 JDK버전에 따라서 지원하는 Gradle 의 최소 버전도 같이 확인해주어야합니다.
Java JDK Version | 자바 지원하는 Gradle 최소버전 |
---|---|
8 | 2.0 |
9 | 4.3 |
10 | 4.7 |
11 | 5.0 |
12 | 5.4 |
13 | 6.0 |
14 | 6.3 |
15 | 6.7 |
16 | 7.0 |
17 | 7.3 |
18 | 7.5 |
19 | 7.6 |
compileOnly 와 implementation의 차이는 다음과 같습니다.
complieOnly | implementation |
---|---|
컴파일 타임에만 필요한 의존성을 정의하는데 사용 | 컴파일 타임 & 런타임 에 모두 의존성을 정의하는데 사용, |
JAR파일에 포함 |
참고 https://goodgid.github.io/Gradle-Difference-CompileOnly-Implementation/