Heim  >  Artikel  >  Java  >  Ladeproblem, wenn zwei JAR-Pakete genau denselben Paketnamen und Klassennamen enthalten

Ladeproblem, wenn zwei JAR-Pakete genau denselben Paketnamen und Klassennamen enthalten

巴扎黑
巴扎黑Original
2017-09-05 13:32:005228Durchsuche

Der folgende Editor bietet Ihnen eine kurze Diskussion über das Ladeproblem zweier JAR-Pakete, die genau denselben Paketnamen und Klassennamen enthalten. Der Herausgeber findet es ziemlich gut, deshalb werde ich es jetzt mit Ihnen teilen und es allen als Referenz geben. Folgen wir dem Editor und werfen wir einen Blick darauf.

Zuerst werden wir es von der Präsentationsebene aus vorstellen und uns dann später mit den Prinzipien befassen.

1. Stellen Sie zunächst kurz vor, wie Maven JAR-Dateien zum Testen generiert


<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. Passen Sie zwei JAR-Pakete an, die denselben Paketnamen und Klassennamen enthalten.

Dies hängt mit der Importreihenfolge des Exports zusammen. Nur der erste wird geladen und läuft einwandfrei.

3. Benutzerdefinierte JAR- und JDK-Pakete, die denselben Paketnamen und Klassennamen enthalten

Es hängt mit der Importreihenfolge des Exports zusammen . Ebenso wird nur das erste geladen, aber wenn Sie ein benutzerdefiniertes JAR laden und ausführen, wird ein Fehler gemeldet. Das Laden von JDK ist normal.


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. Allgemeine Befehle für MVN-JAR-Paketkonflikte

MVN-Abhängigkeit: analysieren, mvn dependency:tree

Das obige ist der detaillierte Inhalt vonLadeproblem, wenn zwei JAR-Pakete genau denselben Paketnamen und Klassennamen enthalten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn