Bibliotheksname zur Laufzeit ermitteln (Classloader)

Status
Nicht offen für weitere Antworten.

Marsman

Bekanntes Mitglied
Hallo Ihr!

Wie kann man eine Klasse aus einer Bibliothek (Jar-Archiv) laden, deren Name nicht genau bzw. erst zur Laufzeit bekannt ist bekannt ist?

Ich habe in Frameworks (z.B. Hibernate) gesehen, dass sie Bibliotheken anderer Hersteller in einem Verzeichnis lib erwarten. Der Name der Bibliotheken darf dabei die Versionsnummer beibehalten. Trotzdem werden die Klassen darin gefunden. Wie kann das sein? Ich würde gerne selber einen solchen Zugriff programmieren. Bisher habe ich dabei aber im Manifest beim Classpath den genauen Namen einer Bibliothek inklusive Version angegeben. Soll nun eine neuere Version der Bibliothek verwendet werden, müsste das Manifest angepasst werden. Diese Vorgehensweise ist mir zu starr.


Titus
 

mfernau

Bekanntes Mitglied
Hallo!

Marsman hat gesagt.:
Wie kann man eine Klasse aus einer Bibliothek (Jar-Archiv) laden, deren Name nicht genau bzw. erst zur Laufzeit bekannt ist bekannt ist?

Per Reflection API mit einem URLClassLoader
Code:
String className = ""; // Name der Klasse die eingeladen werden soll
URL jarDatei = ... // URL zur JAR-Datei die eingeladen werden soll
ClassLoader parentClassLoader = getClass().getClassLoader();
URLClassLoader classLoader = new URLClassLoader(jarDatei, parentClassLoader);
Class loadedClass = classLoader.loadClass(className);

// viele schöne Sachen mit "loadedClass" machen
 

Marsman

Bekanntes Mitglied
Aha, sehr interessant. Allerdings muss ich hier wohl auch den genauen Namen der jar-Datei kennen. Die Versionsnummer, die im Dateinamen normalerweise enthalten ist, kenne ich aber nicht unbedingt (z.B. mysql-connector-java-5.0.7-bin.jar). Weil die Dateinamen der Archive aber immer einem bestimmten Schema folgen, hatte ich gehofft, es würde da auch was einfacheres geben. Zur Zeit sehe ich keine andere Möglichkeit, eine Liste der im Verzeichnis lib enthaltenen Archive zu laden und so den genauen Namen ermitteln zu können. Oder gibts doch was einfacheres?

Titus
 

HoaX

Top Contributor
die klassen in den jars heißen gleich, darauf kommt es an.
wenn du in deiner klasse eine andere klasse namens com.mysql.driver verwendest ist es der vm egal, ob sich nun im classpath eine mysql-5.0.1.jar oder mysql-driver-5.0.1.jar oder mysql-driver-5.0.2beta.jar befindet. die im classpath angegebenen pfade/jars werden nach der zu ladenden klasse durchsucht.
 

Marsman

Bekanntes Mitglied
Soweit okay. Nun habe ich bisher mein Programm aber immer ebenfalls in ein jar-Archiv gelegt. Wenn ich dieses nun mit java -jar Programm.jar aufrufe, wird nur der Classpath verwendet, den ich im Manifest angegeben hatte. Die Angabe einer Klasse oder eines Verzeichnisnamens ist im Manifest meiner Ansicht nach aber nicht möglich. Nur der genaue Name von Archiven. Irgendwie schließt sich für mich das eine und das andere gegenseitig aus. Oder packt ihr eure Anwendungen nicht in jar-Archive? Ich habe das Gefühl, ich mache hier noch irgendwas grundsätzliches falsch.

Titus
 

mfernau

Bekanntes Mitglied
Was ist denn daran so kompliziert ein Verzeichnis nach jar-Dateien zu durchsuchen und diese dann per ClassLoader nachzuladen? Ich bin mir fast sicher, dass das in jedem Programm gemacht wird, das Plugins oder optionale Packages (was ja eigentlich auch nichts weiter als ein Plugin im weiteren sinne darstellt) hinzuladen kann.

Code:
//...
Vector<URL> jarFilesURLs = new Vector<URL>();
File libDir = new File("pfad zum lib Verzeichnis");
File[] jarFiles = libDir.listFiles(
	new FileFilter() {
		public boolean accept(File file) {
			if(file.getName().toLowerCase().endsWith("jar"))
				return true;
			else
				return false;
		}
	}
);
for(File jarFile : jarFiles) {
	jarFilesURLs.add(jarFile.toURI().toURL());
}
URLClassLoader classLoader = new URLClassLoader(jarFilesURLs.toArray(new URL[] {}), getClass().getClassLoader());
// einladen per ClassLoader...

Also das Beispiel ist nur aus einem Teilabschnitt meines Programmes herauskopiert worden. Es kann funktionieren, muss aber nicht :)
Was Du halt noch machen musstest wäre in Zeile 15 eine Logik einzubauen, die Dir eine Jar-Datei anhand des Namens identifiziert (also das Du dann weisst, dass z.b. die mysql Libraries gefunden wurden). Das könnte man mit regexp oder ähnlichem machen.
 
G

Guest

Gast
Okay, vielen Dank für dein Beispiel-Code. Ich hatte nur gehofft, dass es wie von Hoax beschrieben, auch einfacher geht. Eigentlich entsteht das Problem doch eher dadurch, dass beim Aufruf mit java -jar die normale Logik zum Auffinden von Klassen nicht mehr greift.

Titus
 

mfernau

Bekanntes Mitglied
die VM durchsucht die im Classpath angegebenen Pfade nach Class-Dateien und die im ClassPath angegebenen JAR-Dateien. Mehr nicht. Man kann keine JAR-Dateien in Verzeichnisse ablegen und diese dann über eine Pfadangabe mit einem Schlag einladen. Das geht leider nicht. Wenn Du so einen variablen Mechanismus haben möchtest, dass Du JAR-Dateien (egal wie sie heissen) in Deinem lib-Verzeichnis einladen möchtest, dann wirst Du über einen eigenen ClassLoader leider nicht umhin kommen.
Ich denke dafür wird es keinen automatischen Mechanismus geben. Lasse mich aber auch gern eines Besseren belehren - dann könnte ich es mir in meinem Programm auch einfacher machen :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Build-Zeitpunt (Datum und Uhrzeit) irgendwie während der Laufzeit zugänglich machen..? Allgemeine Java-Themen 4
M Laufzeit des Prim Algorithmus Allgemeine Java-Themen 3
M Laufzeit LinkedList Allgemeine Java-Themen 9
M verbesserte Laufzeit bei LinkedList Allgemeine Java-Themen 7
K Verbesserung der Laufzeit beim Sortieren von Einwohnern nach ihrem Geburtsjahr Allgemeine Java-Themen 0
H was ist den dieses zur Kompilierzeit und zur Laufzeit in Java? Allgemeine Java-Themen 3
L Classpath Zur Laufzeit bestimmte Klassen in Classloader hinzufügen? Allgemeine Java-Themen 4
L Compiler-Fehler Google Guice Module zur Laufzeit zusammenstellen und binden Allgemeine Java-Themen 4
J Jasper Reports - Subreport zur Laufzeit ändern Allgemeine Java-Themen 6
O jar und EXE Dateien, Pfade zur Laufzeit Allgemeine Java-Themen 1
T Externe Java Klasen zur Laufzeit einbinden Allgemeine Java-Themen 10
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
D Boolean von ein anderem Java Programm während der Laufzeit ändern Allgemeine Java-Themen 23
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
J .java-Dateitext Compile zur Laufzeit ohne File Allgemeine Java-Themen 15
kodela Daten während Laufzeit zugriffsbereit Allgemeine Java-Themen 15
Neumi5694 Interpreter-Fehler final Eigenschaft während Laufzeit geändert Allgemeine Java-Themen 2
A Java Klasse auf Tomcat während der Laufzeit austauschen Allgemeine Java-Themen 1
M Sinn von Kompilierung zur Laufzeit Allgemeine Java-Themen 3
T Java Class Intrumentation mit Annotations in Laufzeit Allgemeine Java-Themen 1
S Byte Array welches in Laufzeit aufgelöst wird // Objekt Array Allgemeine Java-Themen 3
T Dateien zur Laufzeit in Java-Programm packen? Allgemeine Java-Themen 3
S Laufzeit Primzahlgenerator Allgemeine Java-Themen 18
S Zur Laufzeit Klasse mit einer anzahl von X Objekten erstellen Allgemeine Java-Themen 5
F Classpath Programmteile zur Laufzeit nachladen Allgemeine Java-Themen 6
D Variablen zur Laufzeit global speichern (Registry Pattern?) Allgemeine Java-Themen 6
H ResourceBundle während Laufzeit bearbeiten Allgemeine Java-Themen 3
J Input/Output Jar-Datei zur Laufzeit erweitern Allgemeine Java-Themen 13
P Generic zur Laufzeit Allgemeine Java-Themen 4
A ar während der Laufzeit überschreiben Allgemeine Java-Themen 20
X MergeSort Laufzeit Problem Allgemeine Java-Themen 4
J Resourcen waehrend der Laufzeit aendern? Allgemeine Java-Themen 9
P Wie bei log4j den Dateipfad der Logdatei zur Laufzeit ändern? Allgemeine Java-Themen 3
X Update einer Jar während der Laufzeit Allgemeine Java-Themen 8
T Klassen Fabrik (Factory) zur Laufzeit erweitern Allgemeine Java-Themen 5
S UML zur Laufzeit ändern Allgemeine Java-Themen 10
E Wert von enum zur Laufzeit festlegen. Allgemeine Java-Themen 5
L Methode in Thread mit langer Laufzeit unterbrechen (ANT executeTarget) Allgemeine Java-Themen 4
O Problem bei Darstellung der Laufzeit eines Programms Allgemeine Java-Themen 3
hdi Ressourcen dynamisch zur Laufzeit laden Allgemeine Java-Themen 15
A Wie zur Laufzeit auf Objekte zugreifen Allgemeine Java-Themen 7
N variable Anzahl von Objektinstanzen zur Laufzeit erstellen Allgemeine Java-Themen 4
P Java Konsole zur Laufzeit einblenden Allgemeine Java-Themen 4
P Klassenwahl zur Laufzeit Allgemeine Java-Themen 5
R Objekt zur Laufzeit zerstören? Allgemeine Java-Themen 12
E formartierte Ausgabe zur Laufzeit Allgemeine Java-Themen 2
Sonecc Zugriff auf Class File einer anderen Jar während der Laufzeit Allgemeine Java-Themen 2
F Wie zur Laufzeit ganz neue Objekte erzeugen? Allgemeine Java-Themen 5
T Class-files zur Laufzeit zu Reflection-Zwecken laden Allgemeine Java-Themen 18
DamienX Debug Modus zur Laufzeit erkennen Allgemeine Java-Themen 3
Stillmatic Debuggen/ Laufzeit von Methoden Allgemeine Java-Themen 2
Dragonfire Generic Typ zur Laufzeit Allgemeine Java-Themen 9
M Klasse zur Laufzeit ersetzen Allgemeine Java-Themen 10
S Wie gross ist die Laufzeit für diese Schleife?? Allgemeine Java-Themen 8
G File zur Laufzeit erzeugen Allgemeine Java-Themen 4
G Jar File zur Laufzeit ändern. Allgemeine Java-Themen 4
T Java - Compilieren während Laufzeit Allgemeine Java-Themen 3
Y JARs austauschen zur Laufzeit Allgemeine Java-Themen 11
G Datenbank zur laufzeit wechseln Allgemeine Java-Themen 11
C Innere Klassen zur Laufzeit Instanzieren Allgemeine Java-Themen 4
T Zur Laufzeit erben? Allgemeine Java-Themen 22
L HashMap / Objekte auf Festplatte zur Laufzeit auf HD swappen Allgemeine Java-Themen 7
L Zur Laufzeit eine Klasse laden, die auf jar-File zugreift Allgemeine Java-Themen 15
V Java-Programm weiss zur Laufzeit wie es gestartet wurde? Allgemeine Java-Themen 6
N Endlosschleifen automatisiert erkennen (Code oder Laufzeit)? Allgemeine Java-Themen 6
G Eindeutiges Identifizieren einer JTable/Component z.laufzeit Allgemeine Java-Themen 2
G Datei durchsuchen, lange Laufzeit! Allgemeine Java-Themen 2
A log4j 1.3 und ändern der log Konfiguration zur Laufzeit Allgemeine Java-Themen 4
Apo Zur Laufzeit Klassen mit Packages laden? Allgemeine Java-Themen 2
G genauen Typ einer generischen Klasse zur Laufzeit ermitteln Allgemeine Java-Themen 2
F Typ eines Objekts zur Laufzeit bestimmen? Allgemeine Java-Themen 8
T xverify-parameter : Workaround zur Laufzeit? Allgemeine Java-Themen 8
G Klasse wird zur Laufzeit nicht gefunden? Allgemeine Java-Themen 3
@ zur Laufzeit Interface aus jar implementieren? Allgemeine Java-Themen 5
MQue Laufzeit Allgemeine Java-Themen 4
D Lautstärke einzelner AudioClips zur Laufzeit verändern Allgemeine Java-Themen 4
C Mathefunktion zur Laufzeit einlesen und dann verarbeiten Allgemeine Java-Themen 13
G Klassen zur Laufzeit einbinden Allgemeine Java-Themen 3
J Bibliotheken erst zur Laufzeit laden Allgemeine Java-Themen 5
R Drag und Drop - Fehler während Laufzeit Allgemeine Java-Themen 14
byte Generic Type einer List zur Laufzeit rausfinden? Allgemeine Java-Themen 4
A Class File zur Laufzeit laden ohne den Binary Name zu kennen Allgemeine Java-Themen 11
M Überprüfen einer zur Laufzeit geladenen Klasse Allgemeine Java-Themen 3
H Klassen aus einem Ordner zur Laufzeit laden. Allgemeine Java-Themen 6
S Laufzeit und Compilefehler Allgemeine Java-Themen 6
S JPanel zur Laufzeit verbergen bzw. wieder anzeigen lassen Allgemeine Java-Themen 4
F Objektname zur Laufzeit festlegen? Allgemeine Java-Themen 12
I Sprache zur Laufzeit des Programms ändern Allgemeine Java-Themen 3
G Laufzeit eines aus Java gestarteten Programms beobachten Allgemeine Java-Themen 3
S Log4J: Logdatei zur Laufzeit ermitteln. Allgemeine Java-Themen 2
I Zur Laufzeit ermitteln, ob Klasse in JAR-Datei Allgemeine Java-Themen 2
R iText.jar wird zur Laufzeit nicht gefunden Allgemeine Java-Themen 4
J ResourceBundle / properties-datei während der Laufzeit verän Allgemeine Java-Themen 6
H Methode einer zur Laufzeit generierten Instanz aufrufen Allgemeine Java-Themen 2
M Formel in einem String während Laufzeit berechnen. Allgemeine Java-Themen 4
I Druckerauflösung per JNA ermitteln Allgemeine Java-Themen 3
Kiki01 Häufigster Buchstabe lässt sich nicht ermitteln Allgemeine Java-Themen 30
S Verwendet Programmiersprache aus Quellcode - Datei ermitteln Allgemeine Java-Themen 6
B Dateistart ermitteln Allgemeine Java-Themen 14
MiMa Geldbetrag mit regex ermitteln. Allgemeine Java-Themen 14

Ähnliche Java Themen


Oben