Gibt es eine Möglichkeit, zur Laufzeit die verwendete Version von Guava zu verwenden?

9

Ich habe einen kurzen Überblick über die Guava-Quelle und -Dokumentation gegeben, und beide Versionen scheinen nicht erwähnt zu werden. Ich habe mich gefragt, ob es eine Möglichkeit gibt, wie Guavas Versionsinformationen zur Laufzeit abgerufen werden können.

Diese Versionsinformation muss nicht über irgendeinen Getter zugänglich sein, wenn keine solche Sache tatsächlich existiert; wenn es in einem Feld irgendwo versteckt ist, das nicht GC'd wird, während Guava geladen wird, würde das ausreichen.

Ist diese Versionsinformation zur Laufzeit verfügbar?

Ich habe eine sehr spezifische Verwendung dafür. Ein großer Teil meiner Arbeit besteht darin, Java-Heap-Dumps zu analysieren, um Bereiche im Code zu identifizieren und zu fixieren, die exorbitante Speicherauslastung verursachen. Für diese Aufgabe verwende ich fasthat , eine stark modifizierte Version von jhat mit speziellen Funktionen für meine Arbeit.

Eine dieser Funktionen besteht darin, den Inhalt von Containern anzuzeigen. Ich habe dies bereits für ArrayList , HashMap , ConcurrentHashMap usw. implementiert. (Ich implementiere Typ-Drucker bei Bedarf, basierend auf dem, was ich in unseren Heap-Dumps erlebe.) Derzeit implementiere ich ein Drucker für Guavas CustomConcurrentHashMap eingeben.

Da sich das Layout von Strukturen zwischen Versionen ändern kann, optimiert mein Code sein Entpackungsverhalten, je nachdem, welche Version verwendet wird. Zum Beispiel haben wir bei der Arbeit JRuby 1.2 verwendet, aber kürzlich zu JRuby 1.6 gewechselt, daher habe ich für beide Versionen Typdrucker angegeben und wähle die Version basierend auf den Versionsinformationen aus, die im Heap-Dump gefunden werden.

Also, das ist der Punkt des zweiten Absatzes der Frage: Wenn die Versionsinformationen irgendwo im Heap-Dump sind, ist das alles, was ich brauche.

Und bevor jemand fragt: Heap-Dump-Daten sind nicht "live", Sie können also nicht einfach toString oder ähnliches aufrufen. Sie müssen wirklich die Datenstrukturen laufen lassen, um die Bits herauszuziehen, und Sie müssen Implementierungsdetails wirklich bis zum n-ten Grad verwenden. ; -)

    
Chris Jester-Young 08.10.2011, 02:49
quelle

2 Antworten

3

Dies ist eher eine Problemumgehung, aber ich denke, Sie könnten dies tun, wenn es keinen einfacheren Weg gibt, auf die Guava-Version zuzugreifen:

In den meisten Guava-Releases werden Klassen / Felder / Methoden hinzugefügt / entfernt. Sie könnten versuchen, im Heap-Dump nach ihnen zu suchen und abhängig von ihrer Existenz die Guava-Version zu bestimmen.

Etwas wie:

%Vor%

Offensichtlich sollten Sie die Guava-Versionsnummer zwischenspeichern, da die Berechnung möglicherweise langsam ist ... Der Ansatz könnte erweitert werden, um zusätzliche Methoden / Felder zu berücksichtigen.

Dieser Ansatz könnte auch mit anderen Projekten funktionieren.

    
Etienne Neveu 08.10.2011, 13:41
quelle
4

Wenn Sie die Version einer maven built-Klasse erhalten möchten, können Sie mit der Klasse beginnen, das jar finden, von dem sie kommt, und die Meta-Information lesen, die maven hinzufügt (wie die Version)

Eine einfachere Möglichkeit, dies zu tun, wenn sich die Version im Pfad befindet, besteht darin, sich Ihren Klassenpfad anzusehen, die gefundene Guave und die Version aus dem Dateinamen zu finden.

Bei einem Heap-Dump befindet sich der Klassenpfad in einer Systemeigenschaft.

    
Peter Lawrey 08.10.2011 08:51
quelle

Tags und Links