Classloader Fragen - Wie welche Bibliotheksversionen (jar-Dateien) bestimmen sind loaded

StackOverflow https://stackoverflow.com/questions/139534

  •  02-07-2019
  •  | 
  •  

Frage

Ich habe nur ein weiteres gelöst * I-wenn-ich-was-mit-this-Version-of-a-Bibliothek-but-scheinbar-my-app-Server-hat-schon-geladen-ein-older- Version-of-this-Bibliotheks- * Ausgabe (seufz).

Kennt jemand eine gute Möglichkeit, um zu überprüfen (oder Monitor), ob Ihre Anwendung hat Zugriff auf alle entsprechenden jar-Dateien oder geladene Klasse-Versionen?

Vielen Dank im Voraus!

[P. S. Ein sehr guter Grund zu beginnen, die Verwendung von OSGi Modularchitektur meiner Meinung nach!]

Aktualisieren : Diese Artikel half auch ! Es gab mir einen Einblick, welche Klassen JBoss' Classloader geladen, indem sie in eine Protokolldatei geschrieben werden.

War es hilfreich?

Lösung

Wenn Sie geschehen sein mit JBoss, gibt es eine MBean (der Klassenlader-Repository iirc), wo man für alle Klassenladeprogramme fragen können, die eine bestimmte Klasse geladen hat.

Wenn alle Stricke reißen, gibt es immer ‚java -verbose: class‘., Welche die Position des Glases für jede Klasse-Datei gedruckt wird, die geladen wird,

Andere Tipps

Wenn Sie die entsprechenden Versionen Info in einem Glas manifest haben, gibt es Methoden, die Version abzurufen und zu testen. Keine Notwendigkeit, manuell das Manifest lesen.

java.lang.Package .getImplementationVersion () und getSpecificationVersion () und isCompatibleWith () klingen wie sie tun würde, was Sie suchen.

Sie können das Paket mit this.getClass () erhalten. GetPackage () unter anderen Wegen.

Die javadoc für java.lang.Package geben nicht die spezifischen manifest Attributnamen für diese Attribute. Eine schnelle Google-Suche tauchte es auf unter http: // java. sun.com/docs/books/tutorial/deployment/jar/packageman.html

In der aktuellen Version von Java, Bibliothek Versionierung ist ein ziemlich wollig Begriff, der auf der JAR verläßt sich mit einem nützlichen Manifest richtig verpackt werden. Selbst dann, es ist eine Menge Arbeit für die laufende Anwendung dieser Informationen zusammen in einer sinnvollen Weise zu sammeln. Die JVM-Laufzeit gibt Ihnen keine Hilfe überhaupt.

Ich denke, Ihre beste Wette diese zum Zeitpunkt der Erstellung zu erzwingen ist, die richtigen Versionen von allem holen mit Abhängigkeitsmanagement-Tools wie Ivy oder Maven.

Interessanterweise wird Java 7 wahrscheinlich auch einen geeigneten Rahmen Modul Versionierung für genau diese Art der Sache. Nicht, dass das hilft Ihnen, in diesem Moment,

Ich glaube nicht, dass es ein guter Weg, um das zu überprüfen. Und ich bin nicht sicher, dass Sie das tun wollen. Was Sie tun müssen, ist mit Ihrem App-Server Klasse Lade Architektur vertraut zu machen, und verstehen, wie das funktioniert.

Eine vereinfachte Erklärung, wie es funktioniert, ist: ein EJB oder ein Web-App wird zunächst für eine Klasse aussehen oder eine Ressource in Bibliotheken in einem eigenen Modul (ejb-jar oder Krieg) erklärt. Wenn die Klasse dort nicht gefunden, leitet der Klassenlader die Anforderung an die Lader übergeordneten Klasse, die entweder eine erklärte Abhängigkeit (in der Regel ein ejb) oder die Anwendung Class Loader, die verantwortlich ist, Bibliotheken und Ressourcen im Ohr Paket deklarierten zu laden . Wenn die Klasse oder die Ressource noch nicht gefunden wird die Anforderung an den App-Server weitergeleitet, der in seiner eigenen Classpath aussehen wird.

Nachdem dies gesagt ist, sollten Sie daran denken, dass ein Java EE-Modul (web-app, ejb) immer aus einem Glas-Klassen laden, die in den nächsten Bereich ist. Wenn Sie zum Beispiel log4j v1 in der WAR-Datei, log4j v2 auf Ohrhöhe verpacken und Sie log4j v3 in Ihrem App-Server Klassenpfad setzen, wird das Modul das Glas in einem eigenen Modul verwenden. nehmen, dass weg und es wird die ein auf Ohrhöhe verwenden. nehmen, dass aus und es wird die ein in dem App-Server Classpath verwenden. Die Dinge werden komplizierter, wenn Sie komplexe Abhängigkeiten zwischen den Modulen haben.

Am besten ist es Anwendung globale Bibliotheken auf Ohrhöhe zu setzen.

Es muss ein besserer Weg, als die Art und Weise, die ich es tun, aber ich neige dazu, dies in eine sehr manuellen Art und Weise zu tun.

  1. muss jeder Jar haben es die Versionsnummer im Dateinamen ist (wenn es nicht seinen Namen ändert).
  2. jede Anwendung einen eigenen Classpath hat.
  3. Es muss einen Grund geben, eine aktualisierte Jar (neue Version) zu beginnen. Ändern Sie nicht nur, weil es verfügbar ist, zu ändern, weil es Ihnen Funktionalität gibt, die Sie benötigen.
  4. Jede Version müssen alle Gläser enthalten, die benötigt werden.
  5. Ich halte eine Version der Klasse, die die Liste der Tonkrüge weiß, es muss (dies wird in der Quelldatei kodiert) und kann zur Laufzeit anhand der Liste der Gläser in der Classpath.
  6. überprüft werden

Wie gesagt, es ist manuell, aber es funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top