# JDBC: Relative Pfadangabe in JAR



## eLogic (17. Okt 2011)

Hallo Forum,

ich habe ein Problem:

Ich will eine Verbindung mit einer Datenbank herstellen die sich in der JAR befinden soll.
Ich habe die db in ein Ordner /ext erstellt, und den Ornder dem BuildPath hinzugefügt.


```
Connection cn = DriverManager.getConnection("JDBC:SQLITE:/c:/db.sqlite, "", "" );
```

wenn ich einen Absoluten Pfad angebe funktioniert alles, aber wie gebe ich die DB Relativ an?

wenn ich das hier dranhänge dann kopiert er immer die db leer raus:


```
private String getDbPath() throws InterruptedException{
		URL pfadLocation;
		String returner;
			pfadLocation = ClassLoader.getSystemResource("db.sqlite");
			returner = pfadLocation.getFile().toString().replace("file:/","");

		return "jdbc:sqlite:"+returner;
	}

// ============
	Connection cn = DriverManager.getConnection(getDbPath(), "", "" );
```


----------



## nrg (17. Okt 2011)

Wie sieht dein Class-Path in der MANIFEST.MF aus?

Entweder müsste das aktuelle Verzeichnis hinzugefügt sein:
Class-Path: .
Pfadangabe in Sourcecode: ./ext/Dateiname

Oder das Verzeichnis ext:
Class-Path: ./ext
Pfadangabe in Sourcecode: ./Dateiname


----------



## maki (17. Okt 2011)

Was gibt dir folgender Code aus?
[c]getClass.getProtectionDomain().getCodeSource().getLocation().toURI()[/c]

URLs soltle man nie direkt in einen String umwandeln, sondern erst über eine URI gehen (toURI), dann musst du auch kein [c]file:[/c] rauswerfen.


----------



## eLogic (17. Okt 2011)

maki hat gesagt.:


> Was gibt dir folgender Code aus?
> [c]getClass.getProtectionDomain().getCodeSource().getLocation().toURI()[/c]




```
System.out.println(getClass.getProtectionDomain().getCodeSource().getLocation().toURI());
```

getClass ist rot unterkringelt =)


Wenn ich die db jetzt über 

```
Connection cn = DriverManager.getConnection("jdbc:sqlite:"+ClassLoader.getSystemResource("db.sqlite").toURI().getPath());
```

einbinde, funktioniert es in der IDE, wenn ich es aber als Jar exportiere, bekomme ich "null" zurück?


----------



## maki (17. Okt 2011)

[c]DeineKlasse.class.getProtectionDomain().getCodeSource().getLocation().toURI()[/c]

Wenn du die Db in die Jar reinpackst bekommst du sowieso Probleme.


----------



## eLogic (17. Okt 2011)

```
file:/C:/WORKSPACE/MultimediaVerwaltung/bin/
```



> Wenn du die Db in die Jar reinpackst bekommst du sowieso Probleme.



Wie würdest du das denn machen?


----------



## nrg (17. Okt 2011)

eLogic hat gesagt.:


> Wie würdest du das denn machen?



die DB "neben" die Jar legen


----------



## maki (17. Okt 2011)

Neben die Jar sollte die DB gelegt werden 

Mit dem Code bekommst du ja zumindest mal den Pfad der Jar bzw. der Klassen, von dort aus kannst du ja dann einen relativen Pfad angeben.
Solltest das aber eben unbedingt sowohl in Eclipse aber auch als Jar testen.


----------



## eLogic (17. Okt 2011)

Wenn ich das dann in einen Absoluten Pfad umwandle  mit   c:/bla.jar!db.sqlite   
funktioniert das nicht der kopiert mir die dann jedes mal wieder raus und legt sie eben neben die Jar...

Ich muss später wenn ich das fertig habe noch einstellungen mit properties machen... soll ich die dann auch neben die jar legen?
Kan ich die nicht in dei jar mit einbinden? 

Wenn ich mein Programm dann verteilen will muss ich ja einen ganzen Ordner abgeben, statt eine Jar?


----------



## maki (17. Okt 2011)

> Kan ich die nicht in dei jar mit einbinden?


Nein.

1. Man kann laufende JArs nicht ändern.
2. Jars sind Zip dateien, Zip dateien können nicht geändert werden sondern müssen neu erzeugt werden.



> Wenn ich mein Programm dann verteilen will muss ich ja einen ganzen Ordner abgeben, statt eine Jar?


Kommt darauf an.
- Deine Jar könnte prüfen ob schon eine DB & Properties im Ordner leigen, wenn nicht -> neu anlegen.
- Du verteilst ein Ziparchiv das nur entpackt werden muss oder gleich über einen installer


----------



## Atze (17. Okt 2011)

selbst wenn du das mit dem lesen aus der jar hinbekommst, spätestens beim schreiben in die db, die in der jar liegt, wirds schwierig


----------



## eLogic (17. Okt 2011)

maki hat gesagt.:


> oder gleich über einen installer



Könntest du mir darüber genaueres sagen?


----------



## maki (17. Okt 2011)

?

Ein Installer ist ein Programm (oft mit GUI) welches Software auf einem Rechner installiert, die Luxusvariante eines entpackten Archives eben.


----------



## eLogic (17. Okt 2011)

Okey so genau wollt ich das auch nicht erklärt haben =)

Ich meine gibt es irendwie vorgefertigte Module dafür oder muss man alles selber Programmieren?


----------



## nrg (17. Okt 2011)

z.B. IzPack oder launch4j

finde aber eine zip tuts genauso...


----------

