2008-12-16 4 views

Antwort

29

Classpath-Hölle ist eine unglückliche Konsequenz der dynamischen Verbindung der Art, die von Java ausgeführt wird.

Ihr Programm ist keine feste Entität, sondern die genaue Menge der Klassen, die von einer JVM in einer bestimmten Instanz geladen werden.

Es ist sehr gut möglich, in Situationen zu sein, in denen die gleiche Befehlszeile auf verschiedenen Plattformen oder sogar auf derselben Plattform aufgrund der Auflösungsregeln zu völlig anderen Ergebnissen führen würde.

Es könnte Unterschiede in Standardbibliotheken geben (sehr häufig). Bibliotheken könnten untereinander versteckt sein (eine ältere Version könnte sogar anstelle einer neueren verwendet werden). Die Verzeichnisstruktur könnte die Auflösung beeinträchtigen. Eine andere Version derselben Klasse kann in mehreren Bibliotheken vorkommen und die erste gefundene wird verwendet, usw. Da Java nach Spezifikation eine zuerst gefundene Richtlinie verwendet, können unbekannte Bestellabhängigkeiten zu Problemen führen. Da dies die Befehlszeile ist und Teil der Spezifikation ist, gibt es natürlich keine echten Warnungen.

Es ist sehr viel noch ein Problem. Unter Mac OS beispielsweise bedeutet die schreckliche Unterstützung von Apple, dass Ihre Maschine mehrere JVMs und mehrere JREs enthält, und Sie können Dinge nie von Ort zu Ort schleudern. Wenn Sie mehrere Bibliotheken haben, die mit bestimmten, aber unterschiedlichen Versionen anderer Bibliotheken kompiliert wurden, konnten Sie Probleme usw. haben.

Dieses Problem ist jedoch nicht in Java inhärent. Ich erinnere mich an meinen Anteil an DLL-Hölle Situationen während der Programmierung von Windows in den 90er Jahren. Jede Situation, in der Sie sich auf etwas im Dateisystem verlassen müssen, um Ihr Programm zusammenzustellen, anstatt nur eine gut definierte ausführbare Datei zu haben, ist ein Problem.

Die Vorteile dieses Modells sind jedoch immer noch groß, also bin ich bereit, diese Hölle zu tolerieren. Es gibt auch Schritte in die richtige Richtung auf der Seite der Sonne. Zum Beispiel können Sie in Java6 einfach ein Verzeichnis mit Gläsern angeben, anstatt sie aufzählen zu müssen.

BTW: Klassenpfade sind auch ein Problem, wenn Sie eine Umgebung verwenden, die einen nicht standardmäßigen Classloader verwendet. Zum Beispiel hatte ich viele Probleme, Dinge wie Hibernate oder Digester unter Eclipse auszuführen, weil die Klassenlader nicht kompatibel waren.

2

Ich denke "Classpath Hölle" bezieht sich auf die Zeit, als der Klassenpfad einer Java-Anwendung nur mithilfe der CLASSPATH-Umgebungsvariablen festgelegt werden konnte. Dies führte zu vielen Anwendungen, die Änderungen an der globalen Systemkonfiguration (für jedes Betriebssystem unterschiedlich), Versionskonflikte zwischen Anwendungen und allgemeine Verwirrung erforderten.

3

Classpath/jar-Hölle hat ein paar Notausstiege, wenn sie sinnvoll für Ihr Projekt:

2

Dies ist ein etwas konkreteres Beispiel:

Wenn zwei Bibliotheken (oder eine Bibliothek und die Anwendung) verschiedene Versionen der gleichen dritten Bibliothek benötigen. Wenn beide Versionen der dritten Bibliothek die gleichen Klassennamen verwenden, gibt es keine Möglichkeit, beide Versionen der dritten Bibliothek mit demselben Classloader zu laden.

Nehmen Sie eine Beute bei http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell für weitere Beispiele.

Verwandte Themen