[개발일지] 230704 no main manifest attribute error (With Manifest, jar)

현재 Spring boot 파일을 docker 환경에서 독립적으로 실행해야 하는 상황인데 no main manifest attribute error가 발생했다.

 

main mainfest 속성이 없다는데 manifest가 뭔지 알아보자.

JAR (Java Archive)


MANIFEST.MF 파일을 알아보기 전에 jar파일부터 간단하게 알아보자.

 

jar파일은 여러 개의 Java 클래스 파일, 메타데이터 및 리소스를 하나의 파일로 모아서 사용되는 패키지 파일 포맷이다.

쉽게 생각하면 Java 프로젝트를 압축한 파일이라고 생각하면된다.

 

이 jar파일 안에 존재하는 MANIFEST.MF 파일을 이용해 독립적으로 실행될 수 있는 애플리케이션으로 사용될 수 있는데 이

 

MANIFEST.MF에 대해 알아보자

 

 

Manifest file


MANIFEST.MF파일에는 jar파일의 메타데이터가 포함되어 있다.

이 메타데이터는 jar파일이 어떻게 동작해야 하는지, 어떤 클래스에 메인 메서드가 있는지 같은 정보를 담고 있다.

 

예를 들어, 애플리케이션이 시작할 때 가장 먼저 실행되어야 하는 클래스를 지정하는 'Main-Class' 엔트리가 MANIFEST.MF 파일에 포함되어 있을 수 있다.

 

이 파일은 JAR 파일 디렉터리의 META-INF 디렉터리에 존재한다.

MANIFEST.MF 파일의 기본 구조는 다음과 같습니다:

Manifest-Version: 1.0

Created-By: 1.7.0 (Oracle Corporation)

Main-Class: com.example.MainClass

 

위의 예에서, Manifest-Version은 파일의 버전을 나타내며, Created-By는 JAR 파일을 생성한 Java Development Kit(JDK)의 버전과 제조사를 나타낸다. Main-Class는 애플리케이션이 시작될 때 JVM(Java Virtual Machine)이 가장 먼저 실행하는 클래스를 나타낸다.

 

MANIFEST.MF 파일은 JAR 파일의 동작 방식을 제어하는 역할을 한다고 생각하면 된다.

 

no main manifest attribute error가 발생한 이유


해당 에러 메시지는 jar파일이 실행 가능한 파일이 아니라는 것을 의미하는데 이는 MANIFEST.MF 파일에 Main-Class 속성을 갖고 있지 않아서 발생했을 확률이 크다.

 

해당 에러를 해결하기 위해서 아래와 같이 maven에 spring boot maven plugin을 추가해 주면 된다.

 

 

처음에는 그냥 spring-boot-maven-plugin만 추가했는데 이러면 MANIFEST.MF파일 안에 spring boot를 독립적으로 실행하기 위한 메타데이터가 추가되지 않아 동일한 에러가 발생한다.

 

에러를 해결하기 위해서는 repackage goal을 추가해서 jar파일을 실행가능한 jar파일로 리패키징해야 한다.

 

리패키징하는 과정에서 플러그인은 필요한 모든 의존성과 클래스를 포함시키고, MANIFEST.MF 파일에 메타데이터를 추가한다