intellij

Manifest 속성이 없습니다.

slow333 2022. 12. 14. 21:11

https://wiki.terzeron.com/%EA%B0%9C%EB%B0%9C_%EB%8F%84%EA%B5%AC/IntelliJ/executable_jar_%EB%A7%8C%EB%93%A4%EA%B8%B0_-_%EA%B8%B0%EB%B3%B8_manifest_%EC%86%8D%EC%84%B1%EC%9D%B4_%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4_%EC%98%A4%EB%A5%98_%ED%95%B4%EA%B2%B0
"실행가능한 jar"
기본 Manifest 속성이 없습니다

jar 파일을 빌드해서 실행할 때 Manifest가 없어서 실행이 안된다는 오류가 발생할 수 있습니다. 
별다른 설정이 없다면 실행가능한 jar 대신에 실행가능하지 않은 jar를 생성하기 때문입니다.
원인은 빌드된 jar 바이너리 안에 MANIFEST.MF 파일이 없기 때문이며 
이 파일은 jar의 메타데이터를 
포함하고 있는 파일로서 가장 중요한 용도는 main() 메소드를 포함하는 
클래스의 위치(엔트리 포인트)를 지정하는 것입니다.

이런 에러가 발생하지 않고 제대로 실행되는 jar를 "실행가능한 jar"라고 부르는데, 
실행가능한 jar를 만드는 주요한 방법들을 몇 가지 살펴보겠습니다. 
원리 이해에는 별 관심없고 간단한 해결방법을 찾는 분은 가장 마지막 단락을 읽어보시기 바랍니다.

핵심은 엔트리 포인트를 지정하고 그냥 만들면 jar에 포함되지 않을 외부 의존성을 
모아다가 jar에 포함시키는 것입니다.

1. jar의 -e 옵션으로 엔트리 포인트 지정하기
jar 명령의 -e 옵션을 이용하면 엔트리 포인트를 지정하기 때문에 MANIFEST.MF 파일이 
없어도 실행 가능한 jar를 만들 수 있습니다.

jar -cfe my_app.jar Main *.class
java -jar my_app.jar
그러나 이 방법은 여러 가지 한계점을 가지고 있는데, 의존하는 외부 라이브러리가 많거나 
maven을 이용해서 빌드하는 경우에는 쉽게 사용할 수 있는 방법이 아닙니다.

2. IntelliJ에서 MANIFEST.MF를 자동생성하여 패키징하는 방법
IntelliJ에서는 다음의 과정을 통해 artifact(jar 바이너리)를 만드는 게 좋습니다.

Artifact 설정 단계
Project Settings > Artifacts 메뉴에서 + 버튼을 클릭하여 artifact를 추가 등록합니다.
Jar > from modules with dependencies 선택
Module을 선택합니다. 모듈을 포함하지 않은 프로젝트는 선택할 필요가 없습니다. 
jar의 이름을 프로젝트 이름으로 할 것인지, 모듈 이름으로 할 것인지가 이 선택으로 결정됩니다.
Main Class를 선택합니다.
MANIFEST.MF가 생성될 디렉토리를 src/main/java 대신 src/main/resources로 변경합니다. 
java 디렉토리로 설정되는 것은 IntelliJ의 오래된 버그라는 의견이 있습니다.

OK 버튼을 클릭하고 Apply 버튼을 클릭하여 등록을 완료합니다.
주의사항
jar artifact 항목이 만들어지면, 반드시 Output directory 설정을 살펴볼 필요가 있습니다.
IntellJ는 기본적으로 프로젝트의 최상위 디렉토리에 out 디렉토리를 만들어서 여기에 artifact들을 모아두려고 하기 때문에 개별 모듈의 target 디렉토리에 둔다든가 하는 경우에는 경로를 변경할 필요가 있습니다.
Build 단계
Build > Build Artifacts 메뉴에서 좀 전에 등록했던 jar를 골라서 Build를 실행합니다.
보통 out 디렉토리에 jar가 생성되고 위 artifact 설정을 통해 다른 디렉토리로 지정할 수 있습니다.
하나의 프로젝트 내에서 여러 모듈(jar)을 만들고 싶다면 프로젝트의 out 디렉토리에 모을 수도 있고 아니면 모듈별로 target 
디렉토리를 만드는 방법도 있습니다. maven 기반 프로젝트라면 모듈별 target에 빌드 결과물이 생성되도록 하는 것이 여러 모로 편리합니다.
jar 파일을 선택하고 우클릭으로 Run을 실행하면 됩니다.

3. maven plugin을 활용하는 방법