[java] META-INF의 목적은 무엇입니까?

Java에서는 일부 메타 파일이 포함 된 META-INF 폴더가 종종 나타납니다. 이 폴더의 목적은 무엇이며 거기에 무엇을 넣을 수 있습니까?



답변

일반적으로 META-INF에 아무것도 넣지 마십시오. 대신 JAR을 패키지화하는 데 사용하는 모든 것에 의존해야합니다. 이것은 Ant가 실제로 탁월한 것으로 생각하는 영역 중 하나입니다. JAR 파일 매니페스트 속성을 지정하십시오. 다음과 같이 말하는 것이 매우 쉽습니다.

<jar ...>
    <manifest>
        <attribute name="Main-Class" value="MyApplication"/>
    </manifest>
</jar>

적어도, 나는 그것이 쉽다고 생각합니다 … 🙂

요점은 META-INF가 내부 Java 메타 디렉토리 로 간주되어야한다는 것 입니다. 엉망하지 마십시오! JAR에 포함시키려는 모든 파일은 다른 하위 디렉토리 또는 JAR 자체의 루트에 있어야합니다.


답변

에서 공식 JAR 파일 사양 (링크는 자바 7 버전으로 간다, 그러나 텍스트가 적어도 1.3에서 이후 변경되지 않았습니다)

META-INF 디렉토리

META-INF 디렉토리의 다음 파일 / 디렉토리는 Java 2 플랫폼에 의해 인식되고 해석되어 응용 프로그램, 확장, 클래스 로더 및 서비스를 구성합니다.

  • MANIFEST.MF

확장 및 패키지 관련 데이터를 정의하는 데 사용되는 매니페스트 파일입니다.

  • INDEX.LIST

이 파일은 -ijar 도구 의 새로운 ” “옵션에 의해 생성되며 여기에는 응용 프로그램 또는 확장에 정의 된 패키지의 위치 정보가 포함됩니다. JarIndex 구현의 일부이며 클래스 로더가 클래스 로딩 프로세스 속도를 높이기 위해 사용합니다.

  • x.SF

JAR 파일의 서명 파일 ‘x’는 기본 파일 이름을 나타냅니다.

  • x.DSA

동일한 기본 파일 이름을 가진 서명 파일과 연관된 서명 블록 파일 이 파일은 해당 서명 파일의 디지털 서명을 저장합니다.

  • services/

이 디렉토리는 모든 서비스 제공자 구성 파일을 저장합니다.


답변

일부 Java 라이브러리는 META-INF를 JAR로 패키지하고 CLASSPATH에 포함해야하는 구성 파일을 포함하는 디렉토리로 사용하기 시작했습니다. 예를 들어 Spring에서는 다음을 사용하여 클래스 경로에있는 XML 파일을 가져올 수 있습니다.

<import resource="classpath:/META-INF/cxf/cxf.xml" />
<import resource="classpath:/META-INF/cxf/cxf-extensions-*.xml" />

이 예에서는 Apache CXF 사용 설명서 에서 바로 인용합니다. 있습니다. Spring을 통해 여러 수준의 구성을 허용 해야하는 프로젝트 에서이 규칙을 따르고 구성 파일을 META-INF에 넣었습니다.

이 결정을 반영 할 때 META-INF가 아닌 특정 Java 패키지에 구성 파일을 포함시키는 것만으로 무엇이 잘못 될지 정확히 알 수 없습니다. 그러나 이것은 사실상의 표준으로 보인다. 그 또는 새로운 안티 패턴 🙂


답변

META-INF 폴더는 MANIFEST.MF 파일 의 홈입니다 . 이 파일에는 JAR 내용에 대한 메타 데이터가 포함되어 있습니다. 예를 들어, 실행 가능한 JAR 파일의 정적 main ()을 사용하여 Java 클래스의 이름을 지정하는 Main-Class라는 항목이 있습니다.


답변

거기에 정적 리소스를 배치 할 수도 있습니다.

예를 들면 다음과 같습니다.

META-INF/resources/button.jpg 

를 통해 web3.0 컨테이너에 가져옵니다.

http://localhost/myapp/button.jpg

> 더 읽기

/META-INF/MANIFEST.MF에는 특별한 의미가 있습니다.

  1. 를 사용하여 jar를 실행 java -jar myjar.jar org.myserver.MyMainClass하면 기본 클래스 정의를 jar로 이동하여 호출을로 줄일 수 있습니다 java -jar myjar.jar.
  2. 사용하는 경우 패키지에 메타 정보를 정의 할 수 있습니다 java.lang.Package.getPackage("org.myserver").getImplementationTitle().
  3. Applet / Webstart 모드에서 사용하려는 디지털 인증서를 참조 할 수 있습니다.

답변

Maven의 META-INF

Maven에서 META-INF 폴더는 표준 디렉토리 레이아웃으로 이해 되는데, 이는 이름 규칙에 따라 프로젝트 자원을 JAR 내에 패키지화합니다. $ {basedir} / src / main / resources 디렉토리에 있는 디렉토리 또는 파일 은 JAR로 패키지됩니다 JAR의 기초에서 시작하는 것과 동일한 구조로. $ {basedir} / src / main / resources / META-INF 폴더 에는 일반적으로 .properties 파일이 포함되어 있고 jar 파일에는 다른 파일 중에서 생성 된 MANIFEST.MF , pom.properties , pom.xml이 포함되어 있습니다. 또한 Spring 과 같은 프레임 워크는 사용classpath:/META-INF/resources/ 는 웹 리소스를 제공 데 됩니다. 자세한 내용은어떻게 메이븐 프로젝트에 리소스를 추가하려면 어떻게해야합니까 .


답변

WAR 파일의 경우 여기에 정보를 추가하기 위해 META-INF / MANIFEST.MF 파일은 개발자에게 컨테이너가 애플리케이션에서 모든 클래스를 찾을 수 있도록 컨테이너에서 배치 시간 확인을 시작하는 기능을 제공합니다. 에 달려 있습니다. 따라서 JAR을 놓친 경우 런타임에 응용 프로그램이 없어 질 때까지 기다릴 필요가 없습니다.