Ich habe eine Frage zu den Garantien, falls vorhanden, in dem folgenden Szenario (beachten Sie, dass die Frage nicht "Wie geht das auf andere Weise?", Die Frage bezieht sich wirklich auf die Reihenfolge des Ladens von Klassen im folgenden Fall (um besser zu verstehen, wie Klassenladen funktioniert).Reihenfolge des Ladens einer Klasse aus einer WAR-Datei
Hier ist das hypothetische Szenario ... Es gibt eine .war Datei, die die folgende (teilweise) Verzeichnisstruktur hat:
WEB-INF/classes/com/acme/Bunny.class
.
.
.
WEB-INF/lib/acme.jar
Beide Bunny.class Dateien importieren andere Klassen von acme.jar
Bunny.class in WEB-INF/classes Referenzierung/... ist die einzige Klasse, die denselben Namen/Pfad hat, dass eine Klasse von acme.jar.
Die .jar Dateiacme.jar enthält auch com.acme.Bunny (und es verwendet, um eine keine Sonderklasse loader Tricks).
Ich verstehe, dass die Java-Spezifikation garantiert, dass eine Klasse nicht geladen wird, bis sie vom Programm tatsächlich verwendet (oder "manuell klasse-geladen") wird, weshalb, wenn Sie Tausende von .jar stopfen, Sagen wir, in einem .war beginnen die Klassenladeprogramme nicht mit dem Klassifizieren von Zehntausenden von Klassen.
(edit)
Aber was ist mit der Reihenfolge, in der die zwei Klassen in den obigen Beispielen geladen werden?
sollte formuliert wurden:
Aber wie wird entschieden, welche der zwei Klassen oben geladen wird?
oder so ähnlich :)
Es gibt eine Garantie dafür übernommen: com.acme.Bunny wird von com.acme ... vor jeder anderen Klasse verwendet werden.
Grundsätzlich auf Wikipedia, wird die folgende geschrieben:
Die komplexeste JAR Hölle Probleme unter Umständen entstehen die Vorteil der vollen Komplexität der das Classloading System nehmen. Ein Java Programm ist nicht erforderlich, um nur einen einzelnen "flachen" Classloader zu verwenden, sondern kann aus mehreren (oder in fact, einer unbestimmten Anzahl von) verschachtelten, kooperierenden Classloadern bestehen.Klassen geladen von verschiedenen Klassenlatern können interagieren in komplexer Weise nicht vollständig von einem Entwickler, der zu unerklärlichen Fehlern oder Bugs.
Also ich frage mich: kann ich sicher sein, dass /classes/com/acme/Bunny.class wird vor dem aus .jar innerhalb des WEB-INF/lib/ classloaded werden dir oder nicht?
Beachten Sie, dass ich nicht versuche, .jar Hölle zu lösen. Wenn ich es wäre, würde ich OSGi verwenden. Das Ziel ist es, ein bisschen besser zu verstehen, wie die Dinge unter der Haube funktionieren. – SyntaxT3rr0r
bezogen: http://Stackoverflow.com/questions/1669305/how-does-jvm-deal-mit-duplicate-jars-of-different-versions – meriton