본문 바로가기

Spring Boot

bootJar vs Jar (feat. 멀티모듈)

728x90

멀티모듈 프로젝트를 진행하다가 ./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와 관련이 있습니다.

  1. Jar: *-plain.jar 로 끝나는 파일 
    • 기본적인 Java Archive 파일로, Java 클래스를 포함하는 패키지입니다.
    • 일반적인 Java 애플리케이션을 패키징 할 때 사용되며, 실행 가능한 메인 클래스가 필요합니다. (즉 Jar 파일 단독으로는 실행이 불가능합니다.)
    • 애플리케이션 실행에 필요한 모든 의존성을 포함하지 않고 소스코드의 클래스 파일과 리소스 파일만 포함합니다.
      • 의존성을 제대로 포함하고 있지 않기 때문에 java -jar 명령어로 실행이 제대로 이루어지지 않습니다.
  2. 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

 

SpringBoot Executable jar & Plain jar

최근 스프링부트 2.6.7 버전으로 개발을 하는 중인데 빌드를 하면 jar 파일이 두개가 생성되었습니다. 하나는 기존에 알고 있던 [프로젝트명-버전.jar]이고, 다른 하나는 [프로젝트명-버전-plain.jar]

velog.io

 

https://velog.io/@jthugg/spring-multi-module#131-module-common

 

[Spring] 스프링부트로 멀티 모듈 프로젝트 진행하기

스프링부트 프로젝트를 멀티 모듈 프로젝트로 만들어봅니다.

velog.io

 

728x90
반응형