# jar-File auswählen und Verbindung herstellen



## paedubucher (2. Mrz 2006)

Hallo allerseits

Für ein Projekt benötige ich ein Modul, mit welchem man sich zu einem beliebigen DB-System connecten kann. Dabei habe ich folgende Vorstellungen:

1. Der Benutzer wählt in einem File-Dialog einen JDBC-Treiber aus (jar-Archiv).
2. Der Benutzer gibt Benutzernamen, Passwort und die URL an, um sich mit der DB zu verbinden
3. Der Benutzer klickt auf connect, die Verbindung sollte nun erstellt werden oder es werden Exceptions geworfen und ausgegeben...

Punkt 1 sollte relativ einfach zu erledigen sein, File-Dialoge gibt es ja bereits. Also eher eine GUI bzw. in meinem Beispiel SWT-spezifische Geschichte.

Punkt 2 kann nur der Anwender falsch machen, ist dann halt sein Problem ;-)

Bei Punkt 3 kommt dann mein Problem. Ich muss ja irgendwie im jar-File ermitteln, wo sich die eigentliche Treiberklasse befindet. Beim jdts-Treiber gebe ich ja z.B. folgendes an:


```
Class.forName("net.sourceforge.jtds.jdbc.Driver");
```

Wie bringe ich diesen String in Erfahrung? Ich habe schon mal was von Inspektion gehört. Kann man damit irgend sowas in der Art machen? Kann ich irgend nach einer Klasse in einem jar-File suchen, die ein bestimmtes Interface implementiert oder sowas in der Art? Bin mit JDBC leider auch nocht nicht so bewandert...

Wäre cool, wenn mir jemand ein paar Inputs geben könnte, wie ich diesen String im jar-File ermittle. Ich erwarte natürlich keinen Programmcode, den will ich ja schliesslich selber schreiben.

Danke & Gruss

paedubucher


----------



## Bleiglanz (2. Mrz 2006)

das ist unmöglich, weil es keinen Standard dafür gibt? Glaub ich jedenfalls???

du könntest aber jede Klasse in dem jar schnell mal mit Class.ForName laden und dann mit 

Class#isAssignableFrom(Class<?> cls) 

testen, ob ein java.sql.Driver vorliegt oder nicht

(was anderes fällt mir jetzt auch nicht ein)


----------



## paedubucher (2. Mrz 2006)

Bleiglanz hat gesagt.:
			
		

> das ist unmöglich, weil es keinen Standard dafür gibt? Glaub ich jedenfalls???
> 
> du könntest aber jede Klasse in dem jar schnell mal mit Class.ForName laden und dann mit
> 
> ...



Das geht leider etwas über meine Kenntnisse hinaus.

Ich kann zwar aus dem File-Dialog den Dateinamen ermitteln, wie ich aber dann weitergehe, ist mir ein Rätsel...


----------



## Bleiglanz (2. Mrz 2006)

schau mal das Package java.util.jar an


----------



## paedubucher (2. Mrz 2006)

Bleiglanz hat gesagt.:
			
		

> schau mal das Package java.util.jar an



Folgender Code gibt mir den Namen aller Elemente des jar-Archivs aus. Aber wie erhalte ich einen Klassennamen?


```
Enumeration<JarEntry> entries = jar.entries();
    while(entries.hasMoreElements())
    {
      String item = entries.nextElement().toString();
      System.out.println(item);
    }
```

Wenn ich den Klassennamen dann hätte, würde ich es mit folgendem Code weiterprobieren:


```
Class compare = Driver.class;
    Class temp = Class.forName(klassenname);
    if(temp.isAssignableFrom(driver))
    {
      // temp ist ein JDBC-Driver!!!
    }
```

Könnte das so funktionieren?


----------



## paedubucher (3. Mrz 2006)

Ich habe mich dafür entschieden, dass ein JDBC-Treiber sich im CLASSPATH befinden muss, dass man ihn einbinden kann. Die Problematik hat sich also erledigt...
Wäre zuviel Code für so eine triviale Sache...


----------

