> Java > java지도 시간 > 본문

두 개의 jar 패키지에 정확히 동일한 패키지 이름과 클래스 이름이 포함된 경우 로드 문제

巴扎黑
풀어 주다: 2017-09-05 13:32:00
원래의
5234명이 탐색했습니다.

아래 편집기에서는 정확히 동일한 패키지 이름과 클래스 이름을 포함하는 두 jar 패키지의 로딩 문제에 대해 간략하게 설명합니다. 편집자님이 꽤 좋다고 생각하셔서 지금 공유하고 모두에게 참고용으로 드리고자 합니다. 에디터를 따라가며 살펴볼까요

먼저 프리젠테이션 레이어부터 소개하고, 나중에 원리를 파헤쳐보겠습니다.

1. 먼저 maven이 테스트용 jar 파일을 생성하는 방법을 간략하게 소개합니다


<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.4</version>
    <configuration>
     <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
     </descriptorRefs>
     <archive>
      <manifest>
       <mainClass>Main.Main</mainClass>
      </manifest>
     </archive>
    </configuration>
    <executions>
     <execution>
      <id>make-assembly</id>
      <phase>package</phase>
      <goals>
       <goal>single</goal>
      </goals>
     </execution>
    </executions>
   </plugin>
配置了一个manifest标签来配置Main函数的入口。然后通过如下指令来实现打包。
 
mvn assembly:assembly
로그인 후 복사

2. 동일한 패키지 이름과 클래스 이름

을 포함하는 두 개의 jar 패키지를 사용자 정의합니다. 수출은 주문에 따라 다릅니다. 첫 번째 항목만 로드되어 정상적으로 실행됩니다.

3. 동일한 패키지 이름과 클래스 이름을 포함하는 사용자 정의 jar 및 jdk 패키지

내보내기 가져오기 순서와 관련이 있습니다. 첫 번째 jar만 로드되지만, custom jar을 로드하고 실행하면 오류가 보고됩니다. jdk 로딩은 정상입니다.


protected Class<?> loadClass(String name, boolean resolve)
  throws ClassNotFoundException
 {
  synchronized (getClassLoadingLock(name)) {
   // First, check if the class has already been loaded
   Class<?> c = findLoadedClass(name);
   if (c == null) {
    long t0 = System.nanoTime();
    try {
     if (parent != null) {
      c = parent.loadClass(name, false);
     } else {
      c = findBootstrapClassOrNull(name);
     }
    } catch (ClassNotFoundException e) {
     // ClassNotFoundException thrown if class not found
     // from the non-null parent class loader
    }
 
    if (c == null) {
     // If still not found, then invoke findClass in order
     // to find the class.
     long t1 = System.nanoTime();
     c = findClass(name);
 
     // this is the defining class loader; record the stats
     sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
     sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
     sun.misc.PerfCounter.getFindClasses().increment();
    }
   }
   if (resolve) {
    resolveClass(c);
   }
   return c;
  }
 }
로그인 후 복사

4. mvn jar 패키지 충돌에 대한 일반적인 명령

mvn 종속성: analyze, mvn 종속성: tree

위 내용은 두 개의 jar 패키지에 정확히 동일한 패키지 이름과 클래스 이름이 포함된 경우 로드 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿