[java] Java에서 MANIFEST.MF 파일 사용

JAR, WAR 및 EAR 파일 MANIFEST.MFMETA-INF폴더 아래에 파일이 있음을 알았습니다 .

MANIFEST.MF파일 의 용도는 무엇입니까 ? 이 파일에 무엇을 지정할 수 있습니까?



답변

Java Development Kit 버전 1.0으로 생성 된 JAR 파일의 Manifest 파일 내용은 다음과 같습니다.

Manifest-Version: 1.0

모든 항목은 이름-값 쌍입니다. 헤더의 이름은 콜론으로 값과 구분됩니다. 기본 매니페스트는 매니페스트 사양의 버전 1.0을 준수 함을 보여줍니다. 매니페스트에는 아카이브에 패키지 된 다른 파일에 대한 정보도 포함될 수 있습니다. 정확히 어떤 파일 정보가 매니페스트에 기록되는지는 JAR 파일의 용도에 따라 달라집니다. 기본 매니페스트 파일은 다른 파일에 대해 기록해야하는 정보에 대해 가정하지 않으므로 한 줄에는 자신에 대한 데이터 만 포함됩니다. 특수 목적 매니페스트 헤더

JAR 파일의 의도 된 역할에 따라 기본 매니페스트를 수정해야 할 수 있습니다. JAR 파일이 보관 목적으로 만 생성 된 경우 MANIFEST.MF 파일은 용도가 없습니다. 대부분의 JAR 파일 사용은 단순한 보관 및 압축을 넘어서며 매니페스트 파일에 특수 정보가 있어야합니다. 다음은 일부 특수 목적의 JAR 파일 함수에 필요한 헤더에 대한 간략한 설명입니다.

JAR 파일로 번들로 제공 되는 애플리케이션 : 애플리케이션이 JAR 파일에 번들로 제공되는 경우 Java Virtual Machine에 애플리케이션의 진입 점이 무엇인지 알려야합니다. 진입 점은 public static void main (String [] args) 메서드가있는 모든 클래스입니다. 이 정보는 다음과 같은 일반적인 형식을 가진 Main-Class 헤더에 제공됩니다.

Main-Class: classname

값 classname은 애플리케이션의 진입 점으로 대체됩니다.

다운로드 확장 : 다운로드 확장은 다른 JAR 파일의 매니페스트 파일에서 참조하는 JAR 파일입니다. 일반적인 상황에서 애플릿은 해당 애플릿의 목적을위한 확장으로 사용될 JAR 파일 (또는 여러 JAR 파일)을 매니페스트가 참조하는 JAR 파일에 번들로 제공됩니다. 확장은 같은 방식으로 서로를 참조 할 수 있습니다. 다운로드 확장은 애플릿, 응용 프로그램 또는 다른 확장의 매니페스트 파일에있는 Class-Path 헤더 필드에 지정됩니다. Class-Path 헤더는 다음과 같습니다.

Class-Path: servlet.jar infobus.jar acme/beans.jar

이 헤더를 사용하면 servlet.jar, infobus.jar 및 acme / beans.jar 파일의 클래스가 애플릿 또는 응용 프로그램을위한 확장 기능으로 사용됩니다. Class-Path 헤더의 URL은 애플릿 또는 응용 프로그램의 JAR 파일 URL에 상대적으로 지정됩니다.

패키지 봉인 : JAR 파일 내의 패키지는 선택적으로 봉인 될 수 있습니다. 즉, 해당 패키지에 정의 된 모든 클래스는 동일한 JAR 파일에 보관되어야합니다. 소프트웨어 클래스 간의 버전 일관성을 보장하거나 보안 조치로 패키지를 봉인 할 수 있습니다. 패키지를 봉인하려면 다음과 같이 패키지에 대해 Name 헤더를 추가 한 다음 Sealed 헤더를 추가해야합니다.

Name: myCompany/myPackage/
Sealed: true

Name 헤더의 값은 패키지의 상대 경로 이름입니다. 파일 이름과 구별하기 위해 ‘/’로 끝납니다. 이름 헤더 뒤에 오는 모든 헤더는 공백 행없이 이름 헤더에 지정된 파일 또는 패키지에 적용됩니다. 위의 예에서 Sealed 헤더는 Name : myCompany / myPackage 헤더 뒤에 발생하고 사이에 빈 줄이 없기 때문에 Sealed 헤더는 myCompany / myPackage 패키지에만 적용되는 것으로 해석됩니다.

패키지 버전 관리 : 패키지 버전 관리 사양은 버전 관리 정보를 보관할 여러 매니페스트 헤더를 정의합니다. 이러한 헤더 세트는 각 패키지에 할당 될 수 있습니다. 버전 관리 헤더는 패키지의 이름 헤더 바로 아래에 표시되어야합니다. 이 예는 모든 버전 관리 헤더를 보여줍니다.

Name: java/util/
Specification-Title: "Java Utility Classes"
Specification-Version: "1.2"
Specification-Vendor: "Sun Microsystems, Inc.".
Implementation-Title: "java.util"
Implementation-Version: "build57"
Implementation-Vendor: "Sun Microsystems, Inc."


답변

Manifest.MF는 JAR 파일에 포함 된 파일에 대한 정보를 포함합니다.

JAR 파일이 생성 될 때마다 기본 manifest.mf 파일이 META-INF 폴더 내에 생성되며 다음과 같은 기본 항목을 포함합니다.

Manifest-Version: 1.0
Created-By: 1.7.0_06 (Oracle Corporation)

이들은 “헤더 : 값”쌍으로 된 항목입니다. 첫 번째 버전은 매니페스트 버전을 지정하고 두 번째 버전은 JAR 파일이 생성되는 JDK 버전을 지정합니다.

Main-Class 헤더 :
JAR 파일을 사용하여 애플리케이션을 패키지로 묶을 때 애플리케이션의 진입 점을 제공하는 클래스를 지정해야합니다. 매니페스트 파일의 ‘Main-Class’헤더를 사용하여이 정보를 제공합니다.

메인 클래스 : {완전한 클래스 이름}

여기서 ‘Main-Class’값은 main 메소드가있는 클래스입니다. 이 항목을 지정한 후 JAR 파일을 실행하여 응용 프로그램을 실행할 수 있습니다.

클래스 경로 헤더 :
대부분의 경우 응용 프로그램의 JAR 파일 내에 패키지 된 클래스에서 다른 JAR 파일에 액세스해야합니다. 이는 ‘Class-Path’헤더를 사용하여 매니페스트 파일에 정규화 된 경로를 제공하여 수행 할 수 있습니다.

클래스 경로 : {jar1-name jar2-name directory-name / jar3-name}

이 헤더는 현재 JAR 내부가 아닌 동일한 로컬 네트워크에서 외부 JAR 파일을 지정하는 데 사용할 수 있습니다.

패키지 버전 관련 헤더 :
JAR 파일이 패키지 버전 관리에 사용되는 경우 다음 헤더가 Java 언어 사양에 지정된대로 사용됩니다.

Headers in a manifest
Header                  | Definition
-------------------------------------------------------------------
Name                    | The name of the specification.
Specification-Title     | The title of the specification.
Specification-Version   | The version of the specification.
Specification-Vendor    | The vendor of the specification.
Implementation-Title    | The title of the implementation.
Implementation-Version  | The build number of the implementation.
Implementation-Vendor   | The vendor of the implementation.

패키지 씰링 관련 헤더 :

또한 JAR 파일 내의 특정 패키지가 봉인되어야하는지 여부를 지정할 수 있습니다. 즉, 해당 패키지에 정의 된 모든 클래스가 동일한 JAR 파일에 보관되어야 함을 의미합니다. 이것은 ‘Sealed’헤더의 도움으로 지정할 수 있습니다.

이름 : {package / some-package /} 봉인 됨 : true

여기서 패키지 이름은 ‘/’로 끝나야합니다.

매니페스트 파일로 보안 강화 :

매니페스트 파일 항목을 사용하여 웹 애플리케이션의 보안을 보장하거나 ‘Permissions’, ‘Codebae’, ‘Application-Name’, ‘Trusted-Only’등의 다른 속성으로 패키징하는 애플릿을 사용할 수 있습니다.

META-INF 폴더 :

이 폴더는 매니페스트 파일이있는 위치입니다. 또한 응용 프로그램에 대한 메타 데이터를 포함하는 더 많은 파일을 포함 할 수 있습니다. 예를 들어, EJB 모듈 JAR 파일에서이 폴더에는 JAR의 매니페스트 파일과 함께 EJB 모듈에 대한 EJB 배포 설명자가 포함되어 있습니다. 또한 실행될 애플리케이션 서버의 구체적인 컨테이너 리소스에 대한 추상 EJB 참조의 매핑이 포함 된 xml 파일이 포함되어 있습니다.

참조 :
https://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html


답변