# Derby Datenbank bei Export zu JAR-Datei nicht möglich



## damtre (21. Mai 2012)

Hallo,

ich habe eine Derby Datenbank die ich nutze um schreibend und auch lesend darauf zuzugreifen. In Eclipse funktioniert das soweit alles super. Die Derby.jar Datei befindet sich in meinen Projektordner. 
Wenn ich mein Programm jetzt exportiere und eine JAR Datei erstelle und diese dann mit java -jar D:\MeinProgramm.jar ausführe kriege ich ne ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver, was wohl darauf zurückzuführen ist, dass die Derby.jar nicht gefunden werden kann.

Ich habe daraufhin die JAR-Datei mit Winrar geöffnet und festgestellt, dass die derby.jar gar nicht mit aus meinem Projekt exportiert wurde, obwohl es sich da befindet wo auch alle Sources sind.
Ich habe mit Winrar die derby.jar einfach manuell meinem JAR hinzugefügt, allerdings kommt dann auch wieder die o.g. Fehlermeldung.

Die .classpath Datei die in meinem JAR erzeugt worden ist sieht folgendermaßen aus:

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="src" path="src"/>
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
	<classpathentry kind="lib" path="src/derby.jar"/>
	<classpathentry kind="output" path="bin"/>
</classpath>
[/XML]

Nun frage ich mich, ob und wenn ja wie ich hier nun meine Derby Datenbank auch in einem exportierten JAR File zum laufen kriegen kann.

Danke schon mal.


----------



## nillehammer (21. Mai 2012)

Jar in Jars geht nicht. Entpacke entweder die class-Dateien des Derby-Jars (und aller evtl noch verwendeten 3rd-Party Libs) und packe alles zusammen in ein Jar (Stichwort Uber-Jar) oder such Dir einen geeigneten Ordner, in den Du die 3rd-Party-Jars legst und den Du beim Start dem Classpath hinzufügst. Dafür bietet sich folgende Ordnerstruktur an:

```
user.home/nameDeinesPrograms/
  deinJar.jar <-- Dein ausführbares Jar
  start.bat <-- Startscript für Windows
  start.sh  <-- Startscript für Unixe
  lib/        <-- Unterordner für externe jars
    derby.jar <-- Dein derby.jar
    ...
  data/ <-- Unterordner für Derby's Datenfiles
```
Die Startscripte müssten dann (neben Verzeichniswechsel etc.) folgende Zeile enthalten:

```
java -jar deinJar.jar -cp ./lib/*
```


----------



## damtre (21. Mai 2012)

Oha. Ok das ist für mich nun alles absolutes Neuland....
Ich habe nun auch keine Vorstellung davon wie ich das Skripten muss usw. dass ich diese Jar einfach in Zukunft per Mail verschicken kann und das Programm lauffähig bleibt.
Ich möchte halt auch nicht, dass jeder User dieses JAR-File nur aus einem ganz bestimmten Pfad aus starten kann. Es soll einfach aufm Desktop oder wo auch immer liegen und lauffähig sein. 

Zwecks deines Lösungsvorschlages, wäre es nett wenn du mir vielleicht ne Quelle nennen kannst, damit ich diesen Vorgang nachvollziehen kann. Oder vielleicht kannst du mir auch ne kurze Erläuterung geben wie ich was zu machen habe?! 

Danke


----------



## nillehammer (21. Mai 2012)

Wenn Du Deine Daten persistent speichern willst, wirst Du Dich auf irgendein Verzeichnis für die Speicherung der Derby-Files festlegen müssen. Das Home-Verzeichnis des Nutzers (bei Windows: Eigene Dateien, Bei Unixen i.d.R.: /home/nutzername) bietet sich an, weil Du da fast 100% sicher Schreibrechte hast. Und da Du das schon musst, kannst Du auch gleich das Programm -wie von mir skizziert- in eine festelegte Ordnerstruktur ablegen.

Aber, wenn Du das absolut nicht willst, dann musst Du eben alle class-Files in ein einziges Jar legen. Ich habe aber mit der Exportfunktion von Eclipse dafür keine Möglichkeit gefunden. Insofern musst Du es entweder:
- Von Hand machen (mit einem Zip-Programm die externen Jars enpacken, alle Packages inkl. Deiner eigenen zusammenkopieren, alles zusammen in ein einziges Jar packen)
- Ein Eclipse Plugin suchen, das evtl. mehr kann als die Standard-Exportfunktion
- Ein Buildtool wie maven benutzen


----------



## Bile Demon (21. Mai 2012)

nillehammer hat gesagt.:


> [...] Ich habe aber mit der Exportfunktion von Eclipse dafür keine Möglichkeit gefunden. Insofern musst Du es entweder:
> - Von Hand machen (mit einem Zip-Programm die externen Jars enpacken, alle Packages inkl. Deiner eigenen zusammenkopieren, alles zusammen in ein einziges Jar packen) [...]



Möglicherweise bin ich jetzt auf dem falschen Dampfer, aber ich habe Projekte in Eclipse, die externe JARs einbinden. Wenn ich so ein Projekt mit der Export-Funktion als JAR auswerfe, dann erhalte ich ein  einzelnes lauffähiges JAR-File.
Leider habe ich im Moment keine Möglichkeit nachzuschauen, was in dem JAR alles drin ist, aber die Vermutung liegt doch nahe, dass Eclipse in der Lage ist, externe JARs automatisch zu einem Komplett-JAR zusammenzufügen. Oder?


----------



## nillehammer (21. Mai 2012)

Bile Demon hat gesagt.:
			
		

> Leider habe ich im Moment keine Möglichkeit nachzuschauen, was in dem JAR alles drin ist, aber die Vermutung liegt doch nahe, dass Eclipse in der Lage ist, externe JARs automatisch zu einem Komplett-JAR zusammenzufügen. Oder?


Ich habe die Möglichkeit nachzuschauen (einfach mit einem zip-Programm entpacken, wenn Du keins hast, bei Windows die Endung .zip an den Dateinamen) und habe es direkt vor meinem vorherigen Post ausprobiert (Rechte Maustaste auf Projekt -> Export -> Jar-File, dann den Wizard komplett durchgeklickt) und nicht hinbekommen. Bei mir waren immer nur meine eigenen class-Files drinnen, nicht die der Referenced-Libraries. Hat mich aber auch nicht gestört, weil ich eh ein Build-Tool für sowas benutze.

Wenn du weißt, wie es mit Eclipse richtig geht, dann schreib es. Der TO wird sich freuen.


----------



## Bile Demon (21. Mai 2012)

Ging mir eher darum, dass ich die entsprechenden Projekte und JARs nicht zur Hand habe. Erst heute Abend wieder.

Klar, ich kann dann gerne nachschauen, wie ich das genau gemacht habe.

Wenn man nach "eclipse export jar with libraries" im Netz sucht, findet man allerdings so einiges. Unter anderem das hier:

"When using jar-Export there should be an option
(o) Package required libraries into generated JAR
which does what you want."

Möglicherweise hängt es auch mit der Option "Export Runnable JAR" zusammen, wonach dann ein Manifest erstellt wird mit einer Launch Configuration?


----------



## damtre (21. Mai 2012)

Das wäre ne feine Sache, wenn du mal nachschauen würdest wie das geht.
Ich habe übrigens auch einfach einen Ordner lib angelegt und dort die derby.jar hinterlegt. Wenn ich jetzt eine JAR aus meinem Projekt mache, dann wird diese da auch nun inklusive dem lib-Verzeichnis aufgeführt.
Aber es kommt immer noch der Fehler mit der ClassNotFoundException, obwohl ich die Manifestdatei mit dem ClassPath-Pfad angepasst habe. Aber nichts half, egal wie ich den Pfad angepasst habe.

Hier mal meine Varianten die ich testete:
Class-Path: lib/derby.jar     oder
Class-Path: /lib/derby.jar    oder
Class-Path: ./lib/derby.jar    oder
Class-Path: . /lib/derby.jar

Schon seltsam, dass es nicht einfach ne 1-3 Klick-Variante gibt mit der man das einrichtet!


----------



## Bile Demon (21. Mai 2012)

Na dann hat sich die Frage bezüglich des Deployens ja erledigt.

Habe zur Sicherheit nochmal nachgesehen. Ich kann in Eclipse unter Export -> Runnable JAR File Export auswählen, und dort lässt sich ganz genau einstellen, was Eclipse mit den Required Libraries machen soll.

Funktioniert bei mir bisher einwandfrei. Bei mir packt er die Libs als JAR-Dateien in die JAR-Datei. Eclipse kann die Libs aber wahlweise auch entpacken oder separat als JARs beilegen.

Wieso du allerdings dennoch eine ClassNotFoundException bekommst, da bin ich überfragt.


----------

