# JNLP und ein jar mit einer Access DB



## JRookie (6. Jul 2008)

Hallo zusammen,

Mein Problem: Meine Anwendung soll verteilt werden auf andere Rechner. Jar Datei signieren, JNLP erstellen webSeiten Link  ... alles klar, das Ding läuft auch los, bis zu einem bestimmten Punkt ...
Was macht meine Anwendung? Sie holt Daten aus dem Netz und schreibt sie in eine  MS Access .mdb Datei. 
Wenn meine Anwendung nun auf einem anderen Rechner laufen soll, dann muss er das Verzeichnis (Access_DB) und die Tabelle (Depot.mdb) finden (Verzeichnis und mdb Datei sind natürlich im jar). 

Als .bat Datei funktioniert das, ich packe vorher das Verzeichnis aus:
Aus der .bat Datei:
jar vxf depot.jar Access_DB/Depot.mdb
java -jar Depot.jar

Wie kann ich das bei einer JNLP Datei erreichen ???
Danke im voraus
JRookie


----------



## tuxedo (7. Jul 2008)

Du kannst doch bei Webstart auch Ressourcen mitliefern die _nicht_ in der JAR drin sind. Dann musst du auch nix auspacken. Wie steht in der SUN Webstart-Doku.

- Alex


----------



## JRookie (7. Jul 2008)

Nö, geht nicht, oder ich weiss nicht. Hier mal mein JNLP file:


```
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+"
  codebase="file:///c:"
>
<information>
  <title>Depot</title>
  <vendor>me, myself & I</vendor>
  <homepage href="/jdc" />
  <description>Depot Start</description>
</information>
<offline-allowed/>
<security>
     <all-permissions/> 
</security>
<resources>
  <j2se version="1.2+" />
  <href="F:Entwicklung/Java/Access_DB/Depot.mdb" download="eager"/>
  <jar href="Depot.jar"/>
</resources>
<application-desc main-class="Depot" />
</jnlp>
```

Wird ausgeführt ohne mit der Wimper zu zucken. Keine Meldung, aber auch keine Depot.mdb Datei.
Ich find nirgendwo ein Beispiel, dass das schon mal gemacht wurde
Ratlos
JRookie
[/code]


----------



## tuxedo (8. Jul 2008)

Suchen und lesen hilft. 

Schau mal diesen Thread hier an (GANZ LESEN!): http://www.java-forum.org/de/viewtopic.php?t=57497&postdays=0&postorder=asc&start=0

Da gings zwar nicht um ne Access-File, sondern um eine XML. Das Prinzip ist aber fast das gleiche.

Du hast jetzt 2 Möglichkeiten:

1) Jeder Webstartbenutzer soll seine eigene Access-File benutzen (also kein Multiuser-Betrieb auf die Access-DB):
Dann packst du die File wie im Thread beschrieben in die JAR mit rein, ließt sie beim ersten Programmstart aus der JAR File (die Sache mit "Resource as Stream") raus und sicherst sie beim User auf der Platte und benutzt zukünftig die lokal gespeicherte  Datei (wenn du mit der File arbeiten [lesen und schreiben] willst, dann muss sie irgendwo lokal verfügbar sein).

2) Jeder Webstartbenutzer greift auf die gleiche Access-File zu: Dann ist die Sache mit Webstart völlig wurscht. Leg die File irgendwo zentral ab und konfiguriere deinen per Webstart zu startenden Client so, dass er selbst weiß (oder der User es angeben kann) wo sich die Access-File befindet (Netzwerkfreigabe oder sowas).

Alles in allem: Ein wenig suchen hilft immer.

- Alex

edit: Für Fall 1 könnte dir auch das hir helfen: http://rachel.sourceforge.net/ ... Ist allerdings GPL ...


----------



## JRookie (20. Jul 2008)

So, alles klar,
die Lösung geht über den classLoader. Den Inputsteam in das Objekt umleiten, dass man braucht. In meinem Fall ein File.


```
ClassLoader cl = this.getClass().getClassLoader();  

			InputStream mymdb  = cl.getResourceAsStream("Access_DB/Depot.mdb");
			if (mymdb != null)  {
				int numbytes = mymdb.available() ;
				System.out.println( "numbytes: " + numbytes);	
				File myfile  =  new File ("Depot.mdb");
				fos= new FileOutputStream(myfile);
				int test = 0 ;
				while (test != -1) {
					test = readabyte (mymdb);
					if (test != -1)  {
						//	System.out.println( "Jo, was geschrieben ! " + readabyte (mymdb)+ " Jetzt write ");	
						fos.write(test);
					}
				}

				fos.flush() ;
				fos.close();  
				mymdb.close(); 
				boolean wr = myfile.canWrite();
				System.out.println( "wr: " + wr);
				boolean exec = myfile.setExecutable(true) ;
				System.out.println( "exec: " + exec);	
				conn = AccessJDBCUtil.getAccessDBConnection("C:/Depot.mdb"); 
				stmt = conn.createStatement(); 
			}
			else  {
				conn = AccessJDBCUtil.getAccessDBConnection("Access_DB/Depot.mdb"); 
				stmt = conn.createStatement(); 
			}
		}
```

Das grade geschriebene File lässt sich dann als access Datenbank öffnen.
Wenn ich das Programm unter eclipse in meiner Arbeitsumgebung laufen lasse, ist mymdb tatsächlich null, aber da habe ich ja meine Arbeitsversion der Datenbank im Entwicklerverzeichnis liegen. Der else Zweig ruft direkt auf.
Danke für den Tipp
Viele Grüße
   JRookie


----------

