META-INF의 목적은 무엇인가?
Java에서, 당신은 종종 몇몇 메타 파일을 포함하는 META-INF 폴더를 본다.이 폴더의 목적은 무엇이며 거기에 무엇을 넣을 수 있는가?
공식 JAR 파일 사양(링크에서 Java 7 버전으로 이동하지만 텍스트는 v1.3 이상 이후 변경되지 않음):
META-INF 디렉토리
애플리케이션, 확장자, 클래스 로더 및 서비스를 구성하기 위해 META-INF 디렉토리에 있는 다음과 같은 파일/디렉토리를 Java 2 플랫폼에서 인식하고 해석한다.
MANIFEST.MF
확장을 정의하고 관련 데이터를 패키징하는 데 사용되는 매니페스트 파일.
INDEX.LIST
이 파일은 새로운 "에 의해 생성된다.
-i
" 응용 프로그램 또는 확장에 정의된 패키지에 대한 위치 정보를 포함하는 항아리 도구의 옵션.이것은 JarIndex 구현의 일부로서 클래스 로더에 의해 클래스 로딩 프로세스의 속도를 높이기 위해 사용된다.
x.SF
JAR 파일의 서명 파일.'x'는 기본 파일 이름을 의미한다.
x.DSA
동일한 기본 파일 이름을 가진 서명 파일과 연결된 서명 블록 파일.이 파일은 해당 서명 파일의 디지털 서명을 저장한다.
services/
이 디렉토리는 모든 서비스 공급자 구성 파일을 저장한다.
JEP 238을 구현하는 Java 9가 다중 릴리즈 JARs이기 때문에 새로워졌다.하위 폴더를 볼 수 있음versions
이것은 다른 Java 버전에 대한 클래스를 하나의 항아리에 패키징할 수 있는 기능이다.
일반적으로 말하면, META-INF에 직접 어떤 것도 넣어서는 안 된다.대신 JAR을 포장할 때 사용하는 모든 것에 의존해야 한다.이것은 내가 생각하는 Ant가 JAR 파일 매니페스트 속성을 규정하는 것과 같이 정말로 뛰어나다고 생각하는 분야 중 하나이다.다음과 같은 말을 하는 것은 매우 쉽다.
<jar ...>
<manifest>
<attribute name="Main-Class" value="MyApplication"/>
</manifest>
</jar>
적어도, 그건 쉬운 것 같아... :-)
포인트는 META-INF가 내부 자바 메타 디렉토리로 간주되어야 한다는 것이다.망치지 마!JAR에 포함할 파일은 다른 하위 디렉토리 또는 JAR 자체의 루트에 배치해야 한다.
일부 자바 라이브러리는 JAR과 함께 CLASSPATH에 포함되어야 하는 구성 파일을 포함하는 디렉토리로 META-INF를 사용하기 시작했다는 것을 알게 되었다.예를 들어, 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에 우리의 구성 파일을 넣었다.
이 결정을 반추할 때 META-INF가 아닌 특정 Java 패키지에 구성 파일을 단순히 포함하는 것이 정확히 어떤 문제가 있는지 모르겠다.그러나 그것은 사실상의 표준인 것 같다; 또는 떠오르는 반패턴 :-)
META-INF 폴더는 매니페스트의 홈이다.MF 파일.이 파일은 JAR의 내용에 대한 메타 데이터를 포함하고 있다.예를 들어 실행 가능한 JAR 파일의 정적 메인()을 사용하여 Java 클래스의 이름을 지정하는 Main-Class라는 항목이 있다.
Maven의 META-INF
Maven에서 META-INF 폴더는 이름 규칙에 의해 JARs 내의 프로젝트 리소스를 패키징하는 표준 디렉토리 레이아웃 때문에 이해된다. ${basedir}/src/main/resource 디렉토리 내에 배치된 디렉토리 또는 파일은 JAR의 기저부에서 시작되는 구조와 정확히 동일한 구조로 JAR에 패키지된다.
${basedir}/src/main/resource/META-INF 폴더에는 일반적으로 .properties 파일이 포함되어 있지만, 항아리에는 생성된 매니페스트가 포함되어 있다.MF, pom.properties, pom.xml 파일 중.봄철 사용과 같은 프레임워크classpath:/META-INF/resources/
웹 자원을 제공하다.
자세한 내용은 Maven 프로젝트에 리소스를 추가하는 방법을 참조하십시오.
거기에 정적 자원을 배치할 수도 있다.
예:
META-INF/resources/button.jpg
웹3.0-boards를 통해 웹3.0-boards에 저장
http://localhost/myapp/button.jpg
/METa-INF/MANIFest.MF는 특별한 의미를 갖는다.
- 만약 당신이 항아리를 작동시킨다면
java -jar myjar.jar org.myserver.MyMainClass
통화를 축소할 수 있도록 주 클래스 정의를 병으로 이동할 수 있다.java -jar myjar.jar
. - 사용 중인 경우 패키지에 대한 메타인포메이션 정의 가능
java.lang.Package.getPackage("org.myserver").getImplementationTitle()
. - Applet/Webstart 모드에서 사용하고자 하는 디지털 인증서를 참조할 수 있다.
는 META-INF가 로, META-INF가 있다.ClassLoader
항아리 안의 다른 폴더와 다르게 취급한다.META-INF 폴더 내부에 중첩된 요소는 META-INF 폴더 외부의 요소와 혼합되지 않는다.
다른 뿌리처럼 생각하라.~로부터Enumerator<URL> ClassLoader#getSystemResources(String path)
방법 등 관점:
지정된 경로가 "METa-INF"로 시작되면 메소드는 클래스 경로에 있는 모든 항아리의 META-INF 폴더 내에 중첩된 리소스를 검색한다.
지정된 경로가 "METa-INF"로 시작되지 않으면 메소드는 클래스 경로에 있는 모든 항아리 및 디렉터리의 다른 모든 폴더(META-INF 외부)에서 리소스를 검색한다.
다음과 같은 다른 폴더 이름을 알고 있는 경우getSystemResources
메서드는 특별히 취급한다. 그것에 대해 코멘트를 해달라.
여기에 정보를 추가하기 위해, WAR 파일의 경우 META-INF/MANIFest.MF 파일은 컨테이너가 응용 프로그램이 의존하는 모든 클래스를 찾을 수 있도록 컨테이너에 의한 전개 시간 검사를 시작할 수 있는 기능을 개발자에게 제공한다.이렇게 하면 JAR을 놓친 경우 응용 프로그램이 실행 시 종료될 때까지 기다리지 않아도 JAR이 누락되었음을 인식할 수 있다.
나는 최근에 이 문제에 대해 생각하고 있다.META-INF의 사용에 대한 어떠한 제한도 없는 것 같다.물론 거기에 매니페스트를 넣을 필요성에 대한 어떤 엄격한 규정들이 있지만, 거기에 다른 것들을 넣는 것에 대한 금지 조항은 없어 보인다.
왜 이런가?
cxf 사건은 합법적일 수도 있다.여기 이 비표준이 wsdl의 스키마에 대항하여 서버측 유효성 검사를 방지하는 JBoss-ws의 고약한 버그를 돌아다니기 위해 권장되는 다른 장소가 있다.
http://community.jboss.org/message/570377#570377
하지만 그 어떤 기준도, 그 어떤 것도 없는 것 같다.보통 이런 것들은 매우 엄격하게 규정되어 있지만, 어떤 이유에서인지 이곳에는 기준이 없는 것 같다.이상해. META-INF는 다른 방법으로 쉽게 처리할 수 없는 어떤 필요한 구성의 캐치볼이 된 것 같아.
JPA1을 사용하고 있다면, 당신은 A를 떨어뜨려야 할지도 모른다.persistence.xml
사용할 지속성 장치의 이름을 지정하는 파일.지속성 유닛은 그룹으로 유지될 모든 클래스를 포함하는 일련의 메타데이터 파일 및 클래스와 항아리를 지정하는 편리한 방법을 제공한다.
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으로 이동하여 "Standard Implementation > copyXML " 속성을 확인하십시오.
설명은 아래에 있다.
응용 프로그램이 배포될 때 응용 프로그램 내에 포함된 컨텍스트 XML 설명자( /METa-INF/context.xml에 위치)를 소유하는 호스트의 xmlBase로 복사하려면 true로 설정하십시오.후속적으로 시작할 때, 복사된 컨텍스트 XML 설명자는 응용 프로그램 내부에 포함된 설명자가 더 최근의 것일지라도 응용 프로그램 안에 포함된 어떤 컨텍스트 XML 설명자보다 우선하여 사용될 것이다.플래그 값은 기본적으로 false로 설정되어 있다.배포X의 경우 주의소유 호스트의 ML 속성이 거짓이거나 소유 호스트의 copyXML 속성이 참인 경우 이 속성은 영향을 받지 않는다.
넌 매니페스트를 가지고 있어META-INF 폴더에 있는 MF 파일.액세스 권한이 있어야 하는 선택적 종속성 또는 외부 종속성을 정의할 수 있다.
예:
앱이 lib 폴더 내에 없는 최신 버전의 라이브러리를 필요로 하는 경우(이 경우 옵션으로 에서 최신 버전을 정의한 경우) 앱과 컨테이너(런타임에)를 배포했다고 가정해 보십시오.MANIFEST.MF
그러면 당신의 앱은 거기서부터 종속성을 언급할 것이다.
Source:
헤드 퍼스트 Jsp & 서블릿
또한 META-INF 폴더는 다중 릴리스 병에도 사용된다.이것은 다른 Java 버전에 사용되는 클래스를 하나의 항아리에 패키징할 수 있는 기능이다. 예를 들어, Java 11이 제공하는 새로운 기능이 있는 Java 11의 클래스를 항아리에 포함시킬 수 있고, Java 8의 다른 클래스가 포함된 Java 8의 다른 클래스도 있다.예: 새로운 Java 버전이 API 위반으로 인해 이전 버전에서는 작동하지 않는 향상된 API 메서드를 제공하는 경우 유용할 수 있다.하위 폴더를 볼 수 있음versions
그때의
참조URL: https://stackoverflow.com/questions/70216/whats-the-purpose-of-meta-inf
'Programing' 카테고리의 다른 글
vuex 입력을 편집하기 위해 vuex 개체를 바인딩하는 깨끗한 방법 (0) | 2022.05.03 |
---|---|
네임스페이스(C) (0) | 2022.05.02 |
iOS는 기가바이트의 데이터를 저장할 때 진행형 웹 앱을 제한하는가? (0) | 2022.05.02 |
malloc는 gcc에서 값을 0으로 초기화하는 이유는? (0) | 2022.05.02 |
변환 장치의 일부에 대해서만 GCC 경고를 선택적으로 비활성화 (0) | 2022.05.02 |