답변:
일반적으로 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
이 파일은
-i
jar 도구 의 새로운 " "옵션에 의해 생성되며 여기에는 응용 프로그램 또는 확장에 정의 된 패키지의 위치 정보가 포함됩니다. 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에는 특별한 의미가 있습니다.
java -jar myjar.jar org.myserver.MyMainClass
하면 기본 클래스 정의를 jar로 이동하여 호출을로 줄일 수 있습니다 java -jar myjar.jar
.java.lang.Package.getPackage("org.myserver").getImplementationTitle()
.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/
는 웹 리소스를 제공 데 됩니다. 자세한 내용은어떻게 메이븐 프로젝트에 리소스를 추가하려면 어떻게해야합니까 .
최근 에이 문제에 대해 생각하고 있습니다. 실제로 META-INF 사용에 제한이없는 것 같습니다. 물론 매니페스트를 거기에 두어야 할 필요성에 대해 특정 엄격이 있지만 다른 물건을 거기에 두는 것에 대한 금지는 없습니다.
왜 이런 경우입니까?
cxf 케이스는 합법적 일 수 있습니다. JBoss-ws에서 wsdl의 스키마에 대한 서버 측 유효성 검사를 방해하는 불쾌한 버그를 피하기 위해이 비표준이 권장되는 또 다른 장소가 있습니다.
http://community.jboss.org/message/570377#570377
그러나 실제로 어떤 표준도 존재하지 않는 것 같습니다. 일반적으로 이러한 것들은 매우 엄격하게 정의되어 있지만 어떤 이유로 든 표준이없는 것 같습니다. 이상한. META-INF는 다른 방법으로는 쉽게 처리 할 수없는 필요한 구성을위한 포괄적 인 장소가 된 것 같습니다.
여기에 정보를 추가하면 META-INF는 ClassLoader
jar의 다른 폴더와 다르게 취급 되는 특수 폴더입니다 . META-INF 폴더 안에 중첩 된 요소는 그 외부의 요소와 혼합되지 않습니다.
다른 뿌리처럼 생각하십시오. 로부터 Enumerator<URL> ClassLoader#getSystemResources(String path)
방법 등을 알 관점 :
주어진 경로가 "META-INF"로 시작하면, 메소드는 클래스 경로에있는 모든 jar의 META-INF 폴더 내에 중첩 된 자원을 검색합니다.
주어진 경로가 "META-INF"로 시작하지 않으면이 메소드는 클래스 경로에있는 모든 jar 및 디렉토리의 다른 모든 폴더 (META-INF 외부)에서 자원을 검색합니다.
이 getSystemResources
방법이 특별히 취급 하는 다른 폴더 이름에 대해 알고 있다면 그것에 대해 의견을 말하십시오.
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
모든 답변이 정확합니다. 메타 인포에는 많은 목적이 있습니다. 또한 Tomcat 컨테이너 사용에 대한 예가 있습니다.
Tomcat Doc으로 이동하여 " 표준 구현> copyXML을 확인하십시오. "속성을 .
설명은 다음과 같습니다.
애플리케이션이 배치 될 때 애플리케이션에 임베드 된 컨텍스트 XML 디스크립터 (/META-INF/context.xml에 위치)를 소유 호스트의 xmlBase에 복사하려면 true로 설정하십시오. 이후에 시작할 때, 복사 된 컨텍스트 XML 디스크립터는 애플리케이션 내에 임베드 된 디스크립터가 최신 인 경우에도 애플리케이션에 임베드 된 컨텍스트 XML 디스크립터보다 우선적으로 사용됩니다. 플래그 값은 기본적으로 false입니다. 소유하는 호스트의 deployXML 속성이 false이거나 소유하는 호스트의 copyXML 속성이 true 인 경우이 속성이 적용되지 않습니다.
META-INF 폴더 안에 MANIFEST.MF 파일이 있습니다. 액세스해야하는 선택적 또는 외부 종속성 을 정의 할 수 있습니다 .
예:
앱을 배포했으며 컨테이너 (런타임)에 앱에 lib 폴더 안에없는 최신 버전의 라이브러리가 필요하다는 것을 발견했습니다.이 경우 선택적 최신 버전을 정의 한 경우 MANIFEST.MF
앱이 참조합니다 거기에서 종속성으로 (그리고 충돌하지 않을 것입니다).
Source:
헤드 퍼스트 Jsp 및 서블릿