클래스로더 문제 - 로드된 라이브러리 버전(jar 파일)을 확인하는 방법

StackOverflow https://stackoverflow.com/questions/139534

  •  02-07-2019
  •  | 
  •  

문제

방금 또 다른 문제를 해결했습니다. *이 버전의 라이브러리를 사용하고 있었지만 분명히 내 앱 서버에는 이미 로드된 이전 버전이 있었습니다. -이-라이브러리-*문제(한숨).

애플리케이션이 모든 적절한 jar 파일 또는 로드된 클래스 버전에 액세스할 수 있는지 여부를 확인(또는 모니터링)하는 좋은 방법을 아는 사람이 있습니까?

미리 감사드립니다!

[추신.사용을 시작하는 아주 좋은 이유 OSGi 모듈 아키텍처 내 생각엔!]

업데이트: 이것 기사도 도움이 되었습니다!JBoss의 클래스로더가 어떤 클래스를 로그 파일에 기록하여 로드했는지 통찰력을 얻었습니다.

도움이 되었습니까?

해결책

JBoss를 사용하게 된다면 특정 클래스를 로드한 모든 클래스로더를 요청할 수 있는 MBean(클래스 로더 저장소 iirc)이 있습니다.

다른 모든 방법이 실패하면 로드되는 모든 클래스 파일에 대한 jar 위치를 인쇄하는 'java -verbose:class'가 항상 있습니다.

다른 팁

Jar Manifest에 적절한 버전 정보가있는 경우 버전을 검색하고 테스트하는 방법이 있습니다. 매니페스트를 수동으로 읽을 필요가 없습니다.

java.lang.package.getImplementationVersion () 및 getSpecificationVersion () 및 iscompatiblewith ()가 원하는 작업을 수행하는 것처럼 들립니다.

this.getClass (). getPackage ()로 패키지를 얻을 수 있습니다.

java.lang.package의 javadoc은 이러한 속성에 대한 특정 매니페스트 속성 이름을 제공하지 않습니다. 빠른 Google 검색으로 인해이를 확인했습니다 http://java.sun.com/docs/books/tutorial/deployment/jar/packageman.html

Java의 현재 버전에서 라이브러리 버전 설정은 유용한 매니페스트로 올바르게 포장되는 항아리에 의존하는 다소 울리는 용어입니다. 그럼에도 불구하고, 실행중인 응용 프로그램 이이 정보를 유용한 방식으로 함께 수집하는 것은 많은 작업입니다. JVM 런타임은 전혀 도움이되지 않습니다.

가장 좋은 방법은 Ivy 또는 Maven과 같은 종속성 관리 도구를 사용하여 모든 것의 올바른 버전을 가져 오기 위해 빌드 타임에이를 시행하는 것입니다.

흥미롭게도 Java 7에는 이러한 종류의 일에 대한 적절한 모듈 버전 작성 프레임 워크가 포함될 것입니다. 이 순간에 당신을 돕는 것이 아닙니다.

나는 그것을 확인하는 좋은 방법이 있다고 생각하지 않습니다. 그리고 당신이 그렇게하고 싶지는 않습니다. 당신이해야 할 일은 앱-서버의 클래스 로딩 아키텍처에 익숙해지고 그것이 어떻게 작동하는지 이해하는 것입니다.

작동 방식에 대한 단순화 된 설명은 다음과 같습니다. EJB 또는 웹 애플은 먼저 자체 모듈 (EJB-Jar 또는 War)에서 선언 된 라이브러리에서 클래스 또는 리소스를 찾습니다. 클래스가 찾을 수없는 경우 클래스 로더는 신고 된 종속성 (EJB) 또는 귀 패키지에 선언 된 라이브러리 및 리소스를로드 할 책임이있는 응용 프로그램 클래스 로더 인 부모 클래스 로더에게 요청을 전달합니다. . 클래스 나 리소스를 아직 찾을 수없는 경우 요청은 자체 클래스 경로에서 볼 수있는 앱 서버로 전달됩니다.

즉, Java EE 모듈 (Web-App, EJB)은 항상 가장 가까운 항아리에서 클래스를로드 할 것임을 기억해야합니다. 예를 들어, 전쟁 파일에 log4j v1을 포장하는 경우, EAR 레벨에서 log4J v2를 포장하고 앱-서버의 클래스 경로에 log4J v3을 넣으면 모듈은 자체 모듈에서 JAR을 사용합니다. 그것을 제거하면 귀 수준에서 하나를 사용할 것입니다. 그것을 꺼내면 앱-서버의 클래스 경로에서 하나를 사용할 것입니다. 모듈 간의 복잡한 종속성이 있으면 상황이 더 까다로워집니다.

가장 좋은 방법은 글로벌 라이브러리를 귀 수준으로 배치하는 것입니다.

내가하는 방식보다 더 나은 방법이 있어야하지만, 나는 이것을 매우 수동으로하는 경향이 있습니다.

  1. 모든 항아리는 파일 이름에 버전 번호가 있어야합니다 (이름을 변경하지 않으면 이름이 변경되지 않음).
  2. 각 응용 프로그램에는 자체 클래스 경로가 있습니다.
  3. 업데이트 된 JAR (새 버전)을 사용해야 할 이유가 있어야합니다. 사용 가능한 기능을 제공하기 때문에 변경하지 마십시오. 필요한 기능을 제공하므로 변경하십시오.
  4. 각 릴리스에는 필요한 모든 항아리가 포함되어야합니다.
  5. 필요한 항아리 목록을 알고있는 버전 클래스 (소스 파일에 코딩)를 보관하고 클래스 경로의 항아리 목록에 대해 런타임에 확인할 수 있습니다.

내가 말했듯이, 그것은 매뉴얼이지만 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top