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


답변:


65

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

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

적어도, 나는 그것이 쉽다고 생각합니다 ... :-)

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


17
서비스는 어떻습니까? 태그 라이브러리 설명자? JAR의 루트에 무언가를 넣는 것은 나쁜 생각입니다. 명확한 규칙이 없으면 루트의 리소스가 너무 충돌 할 수 있습니다.
erickson

13
JPA를 사용하는 경우 persistence.xml을 해당 폴더에 넣어야합니다. 이는 자동으로 발생하지 않습니다.
JRSofty

4
간단한 Spring MVC 앱에서 META-INF는 유닛 테스트와 컨트롤러 모두에서 구성 파일을 참조 할 수있는 유일한 디렉토리라는 점을 제외하면 좋은 대답입니다. 다른 디렉토리가 작동하면 훌륭 할 것입니다 (적어도 간단하지는 않습니다). 나에게 전쟁 파일을 테스트하기 위해 단지 Jar 파일을 만드는 것은 차를 만드는 것과 같으므로 부엌으로 걸어 갈 수 있습니다. 적어도 나에게 그러나 나는 루비를하는 데 시간을 보냈고, 구성 파일이가는 한 나를 망쳐 놓았을 수도있다. :)
John Lockwood

이 폴더에 포함되어야하는 파일 형식에 대한 예를 들어 주시겠습니까?
Menai Ala Eddine-알라딘

3
이것은 META-INF가 무엇인지 대답하지 않습니다. 내가 그것에 대한 답을 가지고 있다면, 아마도 그 폴더에 무언가를 넣지 말아야하는지 여부를 스스로 판단 할 수있을 것입니다.
Kröw

164

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

META-INF 디렉토리

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

  • MANIFEST.MF

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

  • INDEX.LIST

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

  • x.SF

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

  • x.DSA

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

  • services/

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


3
TLD도 META-INF로 이동해야합니다.
erickson

@ 에릭슨, 정교한?
Pacerier 2016 년

JSP 태그 라이브러리의 @Pacerier 태그 라이브러리 디스크립터는 META-INF 디렉토리에 있어야합니다. TLD가 2008 년에 다시 위해 서 무엇을 나는 잊고 있었던 것
에릭슨

27

일부 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 패키지에 구성 파일을 포함시키는 것만으로 무엇이 잘못 될지 정확히 알 수 없습니다. 그러나 이것은 사실상의 표준으로 보인다. 그 또는 새로운 안티 패턴 :-)


4
구성은 라이브러리에 속하지 않습니다. 난 당신이 "신흥 안티 패턴"으로 못을 박았다 생각합니다. 라이브러리와 관련된 구성 파일을 찾는 것은 정말 쉽습니다. 물리적으로 동일한 JAR에 들어 가지 않아도됩니다.
erickson

24
구성이 라이브러리에 속하지 않는다는 진술에 동의하지 않습니다. 나는 특히 기본값에 관해서는 구성이 라이브러리에 잘 패키지되어 있다고 생각합니다. 실제로 오래 전에는 일반적이지 않은 모든 종류의 외부 구성 파일을 포함시키는 것과는 반대로 더 많은 프레임 워크가 이와 같이 작동하도록 선택한 것을 기쁘게 생각합니다.
Eelco

1
META_INF에 많은 LICENSE.TXT 유형 파일이 표시되는 것을 보았습니다.
Ti Strga

@Eelco, 코드 및 데이터가 혼합 되어서는 안됩니다 . 외부 구성 파일을 포함한다고해서 유용성이 엉망이되는 것은 아닙니다. 그것은 어떻게 구성되어 있는지에 달려 있습니다.
Pacerier

1
@Pacerier를 언급하는 것은 꽤 임의적입니다. 일반적인 진술로, 그것은 주로 선호됩니다.
Eelco

13

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


10

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

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

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 모드에서 사용하려는 디지털 인증서를 참조 할 수 있습니다.

따라서 응용 프로그램의 정적 항목은 이미지 또는 기타 항목과 같이이 디렉토리에 배치해야합니다.
Menai Ala Eddine-알라딘

6

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/ 는 웹 리소스를 제공 데 됩니다. 자세한 내용은어떻게 메이븐 프로젝트에 리소스를 추가하려면 어떻게해야합니까 .


5

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


5

최근 에이 문제에 대해 생각하고 있습니다. 실제로 META-INF 사용에 제한이없는 것 같습니다. 물론 매니페스트를 거기에 두어야 할 필요성에 대해 특정 엄격이 있지만 다른 물건을 거기에 두는 것에 대한 금지는 없습니다.

왜 이런 경우입니까?

cxf 케이스는 합법적 일 수 있습니다. JBoss-ws에서 wsdl의 스키마에 대한 서버 측 유효성 검사를 방해하는 불쾌한 버그를 피하기 위해이 비표준이 권장되는 또 다른 장소가 있습니다.

http://community.jboss.org/message/570377#570377

그러나 실제로 어떤 표준도 존재하지 않는 것 같습니다. 일반적으로 이러한 것들은 매우 엄격하게 정의되어 있지만 어떤 이유로 든 표준이없는 것 같습니다. 이상한. META-INF는 다른 방법으로는 쉽게 처리 할 수없는 필요한 구성을위한 포괄적 인 장소가 된 것 같습니다.


5

여기에 정보를 추가하면 META-INF는 ClassLoaderjar의 다른 폴더와 다르게 취급 되는 특수 폴더입니다 . META-INF 폴더 안에 중첩 된 요소는 그 외부의 요소와 혼합되지 않습니다.

다른 뿌리처럼 생각하십시오. 로부터 Enumerator<URL> ClassLoader#getSystemResources(String path)방법 등을 알 관점 :

주어진 경로가 "META-INF"로 시작하면, 메소드는 클래스 경로에있는 모든 jar의 META-INF 폴더 내에 중첩 된 자원을 검색합니다.

주어진 경로가 "META-INF"로 시작하지 않으면이 메소드는 클래스 경로에있는 모든 jar 및 디렉토리의 다른 모든 폴더 (META-INF 외부)에서 자원을 검색합니다.

getSystemResources방법이 특별히 취급 하는 다른 폴더 이름에 대해 알고 있다면 그것에 대해 의견을 말하십시오.


3

JPA1 persistence.xml을 사용하는 경우 사용하려는 지속성 단위의 이름을 지정 하는 파일을 여기에 놓아야 할 수도 있습니다. 퍼시스턴스 유닛은 메타 데이터 파일 세트와 클래스, 그룹으로 유지 될 모든 클래스를 포함하는 jar를 지정하는 편리한 방법을 제공합니다.

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

// ...

EntityManagerFactory emf =
      Persistence.createEntityManagerFactory(persistenceUnitName);

자세한 내용은 여기를 참조하십시오 : http://www.datanucleus.org/products/datanucleus/jpa/emf.html


1

모든 답변이 정확합니다. 메타 인포에는 많은 목적이 있습니다. 또한 Tomcat 컨테이너 사용에 대한 예가 있습니다.

Tomcat Doc으로 이동하여 " 표준 구현> copyXML을 확인하십시오. "속성을 .

설명은 다음과 같습니다.

애플리케이션이 배치 될 때 애플리케이션에 임베드 된 컨텍스트 XML 디스크립터 (/META-INF/context.xml에 위치)를 소유 호스트의 xmlBase에 복사하려면 true로 설정하십시오. 이후에 시작할 때, 복사 된 컨텍스트 XML 디스크립터는 애플리케이션 내에 임베드 된 디스크립터가 최신 인 경우에도 애플리케이션에 임베드 된 컨텍스트 XML 디스크립터보다 우선적으로 사용됩니다. 플래그 값은 기본적으로 false입니다. 소유하는 호스트의 deployXML 속성이 false이거나 소유하는 호스트의 copyXML 속성이 true 인 경우이 속성이 적용되지 않습니다.


0

META-INF 폴더 안에 MANIFEST.MF 파일이 있습니다. 액세스해야하는 선택적 또는 외부 종속성정의 할 수 있습니다 .

예:

앱을 배포했으며 컨테이너 (런타임)에 앱에 lib 폴더 안에없는 최신 버전의 라이브러리가 필요하다는 것을 발견했습니다.이 경우 선택적 최신 버전을 정의 한 경우 MANIFEST.MF 앱이 참조합니다 거기에서 종속성으로 (그리고 충돌하지 않을 것입니다).

Source: 헤드 퍼스트 Jsp 및 서블릿


1
소스에서이 중 얼마나 많은 부분이 인용되어 있는지는 확실하지 않으며 실제로는 보이지 않습니다 . 기괴한 서식을 제거했습니다. 코드가 아닌 텍스트에는 코드 형식을 사용하지 마십시오. 인용 된 텍스트에는 인용 형식을 사용하십시오.
Lorne의 후작
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.