개발블로그

spring-boot-maven-plugin (기본 manifest 속성이 없습니다 오류 해결) 본문

Spring

spring-boot-maven-plugin (기본 manifest 속성이 없습니다 오류 해결)

개발자수니 2019. 9. 6. 23:20

springboot maven project를 package 했을 때 생성되는 jar파일을 실행시키면,

"기본 manifest 속성이 없습니다"라는 오류 메시지가 나옵니다.

 

그 이유는 JVM이 jar파일에서 가장 처음 실행할 Main Class를 찾지 못해서 발생하는 오류입니다. 이에 대한 설정은 jar파일 내의 META-INF/MANIFEST.MF에 있어야 하는데, 등록해주지 않았기 때문에 이 오류가 발생한 것입니다. 

 

MANIFEST.MF

 

maven이 package를 할 때, 추가적인 정보들을 MANIFEST.MF에 등록하게 하고자,  pom.xml에 spring-boot-maven-plugin을 추가하겠습니다.

 

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>

 

이 플러그인을 추가한 후, 다시 maven package를 실행하겠습니다.

그리고 jar파일에 있는 MANIFEST.MF를 확인해보면, 다음과 같이 추가적인 정보들이 등록된 것을 확인할 수 있습니다. 

 

spring-boot-maven-plugin을 등록한 후,  MANIFEST.MF

 

중점적으로 봐야할 것은 Main-Class, Start-Class, Spring-Boot-Classes, Spring-Boot-Lib입니다.

  • Main-Class : Springboot application이기 때문에 Main-Class의 Value에 Springboot의 org.springframework.boot.loader.JarLauncher로 지정합니다.
  • Start-Class : 어플리케이션의 MainClass를 Start-Class의 Value에 정의합니다. (만약 Springboot application이 아니라면, Main-Class의 Value에 구현한 어플리케이션의 MainClass를 정의합니다.)
  • Spring-Boot-Classes : 컴파일된 class파일들이 위치한 경로를 정의합니다. 
  • Spring-Boot-Lib : pom.xml에 추가한 의존하고 있는 라이브러리들이 위치한 경로를 정의합니다. 

사실 spring-boot-maven-plugin이 해주는 일은 단순히 MANIFEST.MF에 추가적인 정보를 등록해주는 것만은 아닙니다. 

spring-boot-maven-plugin이 해주는 일 중 하나가 package할 때 의존하고 있는 라이브러리들을 추가해주는 일입니다.

 

maven package한 jar파일
spring-boot-maven-plugin을 사용하여 maven package한 jar파일

 

첫 번째 파일은 spring-boot-maven-plugin을 사용하지 않고 package를 한 jar파일이고, 두 번째 파일은 spring-boot-maven-plugin을 사용하여 package 한 jar파일입니다. 크기 차이가 많이 난다는 것을 확인할 수 있습니다. 

이는 첫 번째 jar파일은 의존하고 있는 라이브러리들이 추가되지 않은 채로 package되어 있기 때문입니다. 

 

 

Comments