스프링 부트가 오래된 버전이라 다른 분들에게 도움이 될 지 모르겠지만 최근 고생했던 Gradle 빌드 오류에 대해 포스팅을 남겨보려고 한다.
해결 과정
몇 년을 관리했지만 배포 할 일이 많지 않은 시스템에서 최근 빌드 오류를 만났다. 사실 bootRepackage의 Unable to find main class에 대해 검색하면 Gradle의 기본 폴더 구조(src/main/java, src/test/java)를 따르지 않아서 Main 클래스를 찾지 못하는 사례를 많이 찾아볼 수 있다.
이 경우는 Gradle 구조에 맞게 소스를 이동하거나 Sourceset에서 위치를 정의하면 해결된다. 하지만 나의 경우는 이런 경우가 아닌 개발 환경과 지극히 개인적 실수에 가깝기 때문에 위와 같은 방법으로 해결하지 못한 개발자가 있다면 내 사례를 한번은 참고해볼만 할 것 같다.
우선 jar까지 실행된 후 오류가 발생해서 compile까지는 문제가 없었구나 생각했지만 "findMainClass" 를 디버깅해봤을 때 main 을 찾을 수 없다는 것을 확인할 수 있었다. 디렉터리 구조에는 문제가 없었고 혹시나 하고 열어본 빌드 패스는 텅텅 비어 있었다. → {PROJECT_PATH}/build/classes/main
컴파일을 돌려도 계속 성공으로만 나오고 실제는 .class 파일이 만들어지지 않아서 오류를 잡는데 거의 3~4일 걸렸고 그 원익은 역시나 허무했다. 우선 내 개발 환경은 오랜 기간 혼자 시스템을 담당하고 있었고 외부망이 방화벽으로 막혀있기 때문에 초기 개발 환경에서 변하는 경우가 거의 없다.
하지만 최근 입사한 분이 있어서 외부망을 열고 함께 개발환경을 다시 설정했고 Gradle Dependency를 강제로 업데이트하면서 gradle cache에 남아있던 부분이 삭제되고 다시 다운받게 되었다. 여기서 오류의 원인이 발생했다.
우선 Springboot: 1.3.5의 의존성을 확인해보면 "spring-boot-configuration-processor"의 버전이 1.3.5.RELEASE 인 것을 확인할 수 있는데 내 의존성을 확인해보니.. 다운받는 버전이 다르다.
그래서 Dependency 쪽을 훑어보는데 최신 버전을 가져오도록 되어 있었다. 사실 이 라이브러리는 Spring Boot 1.3.5에서 @ConfigurationProperty를 사용하기 위해 필요한 것인데 왜 Compile에 영향을 미쳤는지는 아직 원인은 잘 모르겠다. 우선 의존성을 1.3.5.RELEASE로 고정하니 빌드가 정상적으로 동작한다.
개발환경
JAVA: 1.8
Springboot: 1.3.5
Gradle: 2.13
apply plugin: 'java', 'spring-boot' 등등
장애 로그
:processResources
:compileJava
:classes
:findMainClass
:jar
:bootRepackage ← 오류발생
Caused by: java.lang.IllegalStateException: Unable to find main class
at org.springframework.boot.loader.tools.Repackager.buildManifest(Repackager.java:266)
at org.springframework.boot.loader.tools.Repackager.repackage(Repackager.java:189)
at org.springframework.boot.loader.tools.Repackager.repackage(Repackager.java:144)
at org.springframework.boot.gradle.repackage.RepackageTask$RepackageAction.repackage(RepackageTask.java:226)
at org.springframework.boot.gradle.repackage.RepackageTask$RepackageAction.execute(RepackageTask.java:190)
at org.springframework.boot.gradle.repackage.RepackageTask$RepackageAction.execute(RepackageTask.java:165)
at org.gradle.internal.Actions$FilteredAction.execute(Actions.java:205)
at org.gradle.api.internal.DefaultDomainObjectCollection.all(DefaultDomainObjectCollection.java:110)
at org.gradle.api.internal.tasks.RealizableTaskCollection.all(RealizableTaskCollection.java:182)
at org.gradle.api.internal.DefaultDomainObjectCollection.withType(DefaultDomainObjectCollection.java:120)
at org.springframework.boot.gradle.repackage.RepackageTask.repackage(RepackageTask.java:140)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:228)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:221)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:210)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:585)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:568)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)