멀티모듈 프로젝트를 진행하다가 ./gradlew build 로 프로젝트를 build 하려고 하니 build에 실패하면서 아래와 같은 에러가 발생했습니다.
Starting a Gradle Daemon (subsequent builds will be faster)
> Task :bootJar FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':bootJar'.
> Error while evaluating property 'mainClass' of task ':bootJar'
> Failed to calculate the value of task ':bootJar' property 'mainClass'.
> Main class name has not been configured and it could not be resolved
해당 에러는 main 메서드가 없는 모듈에서 bootJar을 생성하려고 할 때 생기는 에러입니다. 즉, main 메서드가 있는 모듈을 제외한 나머지 모듈들의 gradle 에 별도에 설정이 필요했고, 구글링을 해 본 결과 bootJar과 Jar(plainJar)로 인해 발생한 문제라는 것을 확인하였습니다.
gradle에 필요한 별도 설정은 아래와 같았습니다. (main 메서드가 없는 모듈들에 아래 두 블록을 추가 합니다.)
plugins {
...
}
dependencies {
...
}
tasks.jar {
enabled = true // plainJar만 활성화
}
tasks.bootJar {
enabled = false // bootJar 비활성화
}
bootJar와 Jar(plainJar)가 무엇인지 찾아보았습니다.
bootJar와 Jar는 둘 다 Java 애플리케이션을 패키징 하는 방법이지만, 주요 차이점은 Spring Boot와 관련이 있습니다.
- Jar: *-plain.jar 로 끝나는 파일
- 기본적인 Java Archive 파일로, Java 클래스를 포함하는 패키지입니다.
- 일반적인 Java 애플리케이션을 패키징 할 때 사용되며, 실행 가능한 메인 클래스가 필요합니다. (즉 Jar 파일 단독으로는 실행이 불가능합니다.)
- 애플리케이션 실행에 필요한 모든 의존성을 포함하지 않고 소스코드의 클래스 파일과 리소스 파일만 포함합니다.
- 의존성을 제대로 포함하고 있지 않기 때문에 java -jar 명령어로 실행이 제대로 이루어지지 않습니다.
- bootJar: *.jar 로 끝나는 파일
- Spring Boot에서 제공하는 특수한 JAR 파일입니다.
- Spring Boot 애플리케이션을 쉽게 배포할 수 있도록 설계되었으며, 모든 종속성을 포함하여 독립 실행 가능한 애플리케이션을 만듭니다.
- 따라서, 애플리케이션을 실행하기 위해 java -jar 명령으로 실행할 수 있습니다.
- Spring Boot의 특성인 자동 설정 및 외부 설정을 지원합니다.
Jar
├── META-INF/
│ └── MANIFEST.MF
└── com/
└── example/
└── MyApplication.class
bootJar
├── META-INF/
│ └── MANIFEST.MF
├── BOOT-INF/
│ ├── classes/
│ │ └── com/
│ │ └── example/
│ │ └── MyApplication.class
│ └── lib/
│ ├── dependency1.jar
│ └── dependency2.jar
└── ...
결론적으로, bootJar는 Spring Boot 애플리케이션을 위한 특화된 JAR 파일로, 모든 종속성과 실행 환경을 포함하는 반면, Jar는 기본적인 Java 애플리케이션 패키징에 사용됩니다.
결론
즉, main 메서드가 없는 모듈에서 bootJar을 생성하려고 하여서 에러가 났던 것이었습니다. 위와 같이 설정을 변경하면, Spring Boot 프로젝트를 빌드할 때 bootJar 가 생성되지 않고 plainJar만 생성할 수 있습니다.
참고 블로그
https://velog.io/@shawnhansh/SpringBoot-Executable-jar-plain-jar
https://velog.io/@jthugg/spring-multi-module#131-module-common
'Spring Boot' 카테고리의 다른 글
스프링 AOP의 내부호출 문제 및 해결법 (1) | 2024.10.03 |
---|---|
Spring AOP - 포인트컷(pointcut) 지시자(@annotation, this, target) (0) | 2024.10.02 |
Spring AOP - 포인트컷(pointcut) 지시자(@target, @within) (0) | 2024.10.02 |
Spring AOP - 포인트컷(pointcut) 지시자(within, args) (1) | 2024.10.02 |
Spring AOP - 포인트컷(pointcut) 지시자(execution) (0) | 2024.10.02 |