Frage

Ich habe eine interessante Frage zu Classloader Verhalten bekommt.

Frage ein: Was ist die Reihenfolge, in der die Klassenlader Gläser geladen wird,

Die folgenden Gläser und enthält Klassen angegeben:

a.jar
  +-com/scheffield/foo/A.class

b.jar
  +-com/scheffield/foo/B.class

Welche Klasse geladen werden?

Frage zwei: Ist es wahr, dass der Pfad und Name einer Datei im Classpath ist einzigartig

Die folgenden Gläser und enthalten Klassen angegeben (reale Welt Beispiel):

spring-beans-3.0.3.RELEASE.jar
  +-META-INF/spring.schemas

spring-aop-3.0.3.RELEASE.jar
  +-META-INF/spring.schemas

Was ich Ihnen sagen kann ist, dass beide Dateien von Spring geladen werden, andernfalls wird eine Ausnahme auftreten würde (siehe dieser Artikel ).

Warum ich frage, dass:

Ich habe ein so genanntes großes Glas ( Kochbuch Eintrag für gradle ). Das ist ein Glas mit den Anwendungsklassen und alle anderen Abhängigkeiten entpackt und Paket in dem großen Glas. Und ich bin nicht ganz sicher, was mit duplizierten Dateien zu tun.

War es hilfreich?

Lösung

  1. Die Klassen sind aufgelöst jedoch ein Klassenlader, sie lösen will (das der springende Punkt ist eine Classloader-Architektur mit). Die meisten Klassenladern Sie mit in der Praxis behandeln sind Varianten von java.net .URLClassLoader die Lasten Klassen (und Ressourcen), basierend auf einem Suchpfad (Classpath) von Verzeichnissen und Gläser. Jeder Standort im Suchpfad wird als Quelle der Klassen behandelt und die Standorte werden in der Reihenfolge durchsucht.

  2. Nein, Namen sind nicht eindeutig. Die erste in der Suchreihenfolge angetroffen wird verwendet.

Wenn Sie Gläser in ein großes Glas kombinieren gibt es eine eindeutige Möglichkeit von Konflikten. Wenn Sie vorsichtig sind sie von der letzten Quelle zu den ersten in der effektiven Classpath fusionieren (also zwingenden späten Gläsern mit früheren Gläsern), werden Sie ungefähr das gleiche Ergebnis.

Ich sage etwa weil die Manifeste in Gläsern enthalten zusätzliche Verarbeitungsanweisungen, dass Bedarf auch zusammengeführt werden. Zum Beispiel kann ein Manifest ein Class-Path-Attribut enthält, dass enthält zusätzliche Gläser in den Klassenpfad. Es ist möglich, Gläser zu fusionieren, aber verlieren manifestieren Attribute, den Teil Ihres tatsächlichen notwendigen Classpath angeben. Wenn Ihr Manifest enthält versiegelt oder

Andere Tipps

  1. die Dateien in der Reihenfolge werden die enthaltenen Gläser auf dem Classpath erscheinen geladen. dies gilt für Klassen. wenn Sie andere Ressourcen geladen werden (wie die spring.schema) können Sie entweder classloader.getResource (...) oder classloader.getResources (...). die erste die erste Ressource auf dem Classpath returnes, auch die zweite returnes beschattet Ressourcen.
  2. Ich glaube nicht, ein gültiges ZIP-Archiv enthält doppelte Einträge.

Bezug

scroll top