# GWT - Externe Java Libs auf Server Seite - zB. JDBC



## MadBlue (26. Nov 2013)

Hallo zusammen,

ich mach gerade meine ersten Gehversuche mit GWT.
Aktuell versuche ich auf der Serverseite eine Verbindung zu meinem mySQL Server herzustellen.
Hab dazu den mySQL JDBC Treiber als externe JAR in die "build Path" importiert. Beim Ausführen kams dann natürlich zum Error, da das Paket wohl dem Application-Server nicht bekannt ist. Hab das Paket dann noch mit " <inherits name="com.mysql.jdbc"/>" in die *.gwt.xml importiert. (wobei ich mir nicht ganz sicher bin ob hier nicht nur Client Seitige Pakete importiert werden müssen?)

Na wie auch immer, das wirft jetzt eine andere Exception:

```
[ERROR] Unable to find 'com/mysql/jdbc.gwt.xml' on your classpath; could be a typo, or maybe you forgot to include a classpath entry for source?
         [ERROR] Line 16: Unexpected exception while processing element 'inherits'
```

Glaub ich treib da gerade Unfug.
Weiß da wer wie man das richtig anstellt?

Sören

EDIT:
Habs selber raus bekommen.
Der "Trick" ist das die externe Jar mit ins war verzeichnis muss... hab den BuildPath dann auch direkt da drauf gelegt und fertig...


----------



## Latsche90 (3. Dez 2013)

Hi,

kann mir hierzu auch jemand helfen?

Versuchs schon seit 5 stunden selbst hin zu bekommen, aber klappt nicht. 

Ich programmiere mit Eclipse.
Ich habe eine kleine GWT-Anwendung mit GWT-RPC, wo serverseitig auf meine mysql-datenbank zugegriffen wird. Die Anwendung wird fehlerfrei compiliert nur das komische:

Sobald ich mit der Client-seite teste, kommt eine Fehlermeldung, dass die Mysql-Treiber nicht gefunden werden. Baue ich aber eine Main-Klasse auf der serverseite dazwischen und teste nur den Datenbankconnector, findet er die Mysql-Treiber.

Was du oben geschrieben hast, habe ich auch probiert hat aber nichts davon geklappt.

Bin am verzweifeln, baue jetzt auf euch

grüße

*.gwt.xml
[XML]
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.5.1//EN"
  "http://google-web-toolkit.googlecode.com/svn/tags/2.5.1/distro-source/core/src/gwt-module.dtd">
<module rename-to='alphabetmemory'>  
  <inherits name='com.google.gwt.user.User'/>

  <inherits name='com.google.gwt.user.theme.clean.Clean'/>

  <entry-point class='de.home.alphabetMemory.client.AlphabetMemory'/>

  <source path='client'/>
  <source path='Beans'/>
  <source path='Beans.services'/>



</module>

[/XML]

dbconnector.java

```
package de.home.alphabetMemory.server.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnector {
	
	private static Connection con;
	
	public static void createDriverClass() {
		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			System.out.println("com.jdbc.mysql.Driver gefunden");
		} catch (ClassNotFoundException e) {
			System.out.println("com.jdbc.mysql.Driver nicht gefunden");
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static void connect() {
		try {
			con = DriverManager.getConnection("jdbc:mysql://localhost:3306/memory", "root", "grefrath");
			System.out.println("Datenbankverbindung erstellt");
		} catch(Exception e) {
			System.out.println("Fehler: Verbindung zur Datenbank konnte nicht hergestellt werden");
			e.printStackTrace();
		}
	}
	
	public static void disconnect() {
		try {
			con.close();
			System.out.println("Datenbankverbindung geschlossen");
		} catch (SQLException e) {
			System.out.println("Fehler: Connection konnte nicht geschlossen werden.");
			e.printStackTrace();
		}
	}
	
	public static Connection getCon() {
		return con;
	}

}
```

playermapper.java

```
Eine riesen Klasse die Informationen in die Datenbank speichert. Aber der Fehler wird immer schon oben im DBConnector geworfen.
```

main.java

```
package de.home.alphabetMemory.server.db;

import de.home.alphabetMemory.Beans.Player;

public class Main {
	
	public static void main(String[] args) {
		PlayerMapper pm = new PlayerMapper();
		
		for(Player p : pm.showAllPlayer()) {
			System.out.println(p.toString());
		}
	}

}
```


----------



## MadBlue (3. Dez 2013)

Hi,

also erstmal: Das du nicht von der Client Seite auf den MySQL Treiber zugreifen kannst ist eh klar gell?

Das Problem ist wie bereits kurz angeschnitten, das zur Laufzeit des Programms, der Java-App-Server nicht auf die mySQL Libs zugreifen kann, da diese einfach nicht im Package vorhanden sind. In der klassischen Java-EE Anwendung kann man die ja einfach mit "Deploy Assembly" hinzufügen. In der GWT schaut das anders aus.

Meine Lösung war wie folgt: Lege den MySQL treiber (also die .jar) in das Libs Verzeichnis im War Ordner des GWT Projektes, und mach den Build-Path von dort aus. Weiß nicht ob das die Vorzeigelösung ist, aber sie tut es zumindest!

Sören


----------



## Latsche90 (3. Dez 2013)

Danke für die sehr schnelle Antwort.

Also hab jetzt die *mysql.jar* datei in den \war\WEB-INF\lib\* gelegt und er findet den Treiber 
Cool danke schonmal.

Aber dass der Client jetzt trotzdem nicht auf die Datenbank kommt ist mir nicht so ganz klar sry. Jetzt kommt nämlich bei mir in der PlayerMapper.java Klasse der Fehler. Aber das liegt nicht am Quellcode sondern weil gwt wieder iwelche Klassen nicht findet.

Z.b kommt jetzt bei mir diese Fehlermeldung über die Client-Seite

```
Unable to initialize driver properties due to java.lang.IllegalAccessException: Class com.google.appengine.tools.development.agent.runtime.Runtime can not access a member of class com.mysql.jdbc.ConnectionPropertiesImpl with modifiers "private"
```

Sry das mit der GWT-logik hab ich noch nicht so ganz raus.
Was muss ich tun, damit der Client den Servercode und Mysql-Code sauber ausführen kann.


----------



## MadBlue (3. Dez 2013)

Die Client Seite kann nur GWT eigene Klassen verwenden da diese Objekte hinterher nach Java-Script kompiliert werden. Der Java-Java-Script Kompiler hat aber keine Ahnung wie ein MySQL Treiber in Java-Script aussehen müsste.

Wenn du etwas aus der Datenbank laden willst, dann tust du das auf der Server Seite. Die geladenen Informationen steckst du in ein GWT Kompatibles Objekt. Das kannst du ja auf der Client-Seite ausführen.

Bin aber auch nicht ganz Trittsicher auf dem Thema. Bin selber noch dabei mich rein zu arbeiten.

sröen

EDIT:

nur so btw. du willst auch nicht das Client-Seitig eine Datenbankverbindung aufgebaut wird. Damit könnte wer auch immer vom Client sitzt noch ne ganze Menge Unfug anstellen. Denk dran, der Java-Script Code kann als Klartext ausgelesen werden!


----------



## Latsche90 (3. Dez 2013)

Ok, danke schonmal. Wenn ich ne Lösung finde, die ich verstehe, meld ich mich nochmal.

Wobei ich ja serverseitigen Quellcode habe, weil ich hab ja diese GWT-RPC schicht gebaut. Also zwischen dem PlayerMapper sind jetzt noch diese PlayerService.java PlayerServiceAsync.java und PlayerServiceImpl.java Klassen, die ja von GWT-Klassen erben müssen. Und dahinter ist dann die Oberfläche mit meinem EntryPoint.


----------



## Latsche90 (4. Dez 2013)

Hab die Lösung warum es bei mir nicht Funktioniert hat, ist zum Haare raufen.

Ich habe das jdk 1.7.0_25 benutzt. Das läuft wohl nicht sauber mit GWT.
Mit JDK 1.7.0_21 funktioniert es.

java - MySQL google app engine at local machine - error - Stack Overflow


----------

