아래 편집기에서는 정확히 동일한 패키지 이름과 클래스 이름을 포함하는 두 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!