# Remote Application Platform - Fragen über Fragen und keiner weiß nichts genaues



## zitrone18 (9. Dez 2014)

Hallo zusammen,

ich muss mich gerade mit der Remote Application Platform (RAP) beschäftigen.
Hab mir schon eine GUI gebastelt und auch schon den ein oder anderen EventHandler eingebaut, bis dahin ist alles gut.

Jetzt möchte ich gerne eine Datenbankanbindung in meinem RAP-Projekt implementieren. Beim Versuch den Spaß zu "compilieren" gibt es diese Fehlermeldung


```
java.lang.ClassNotFoundException: org.sqlite.JDBC
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Unknown Source)
	at helloworld.BasicEntryPoint.createContents(BasicEntryPoint.java:33)
	at org.eclipse.rap.rwt.application.AbstractEntryPoint.createUI(AbstractEntryPoint.java:53)
	at org.eclipse.rap.rwt.internal.lifecycle.PrepareUIRoot.execute(PrepareUIRoot.java:40)
	at org.eclipse.rap.rwt.internal.lifecycle.PhaseExecutor.execute(PhaseExecutor.java:40)
	at org.eclipse.rap.rwt.internal.lifecycle.SimpleLifeCycle.execute(SimpleLifeCycle.java:48)
	at org.eclipse.rap.rwt.internal.service.RWTMessageHandler.executeLifeCycle(RWTMessageHandler.java:57)
	at org.eclipse.rap.rwt.internal.service.RWTMessageHandler.handleMessage(RWTMessageHandler.java:41)
	at org.eclipse.rap.rwt.internal.remote.MessageChainElement.handleMessage(MessageChainElement.java:28)
	at org.eclipse.rap.rwt.internal.service.LifeCycleServiceHandler.processMessage(LifeCycleServiceHandler.java:175)
	at org.eclipse.rap.rwt.internal.service.LifeCycleServiceHandler.processUIRequest(LifeCycleServiceHandler.java:147)
	at org.eclipse.rap.rwt.internal.service.LifeCycleServiceHandler.handleUIRequest(LifeCycleServiceHandler.java:105)
	at org.eclipse.rap.rwt.internal.service.LifeCycleServiceHandler.synchronizedService(LifeCycleServiceHandler.java:83)
	at org.eclipse.rap.rwt.internal.service.LifeCycleServiceHandler.service(LifeCycleServiceHandler.java:75)
	at org.eclipse.rap.rwt.engine.RWTServlet.handleValidRequest(RWTServlet.java:126)
	at org.eclipse.rap.rwt.engine.RWTServlet.handleRequest(RWTServlet.java:110)
	at org.eclipse.rap.rwt.engine.RWTServlet.doPost(RWTServlet.java:100)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:755)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
	at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
	at org.eclipse.jetty.server.Server.handle(Server.java:370)
	at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
	at org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:53)
	at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982)
	at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043)
	at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)
	at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
	at org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:72)
	at org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:264)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
	at java.lang.Thread.run(Unknown Source)
```

Der Code ist folgender:


```
package helloworld;

import java.sql.*;

import org.eclipse.rap.rwt.application.AbstractEntryPoint;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;

public class BasicEntryPoint extends AbstractEntryPoint {

	//SWT
	GridData data = null;
	GridLayout layout = null;
	
    @Override
    protected void createContents(Composite parent) {
    	
    	parent.setLayout(new FillLayout());
        Ressourcen res = new Ressourcen(parent, SWT.NONE);        
        res.setVisible(true);
        
        try {
			DriverManager.registerDriver((Driver) Class.forName("org.sqlite.JDBC").newInstance());
			String url = "jdbc:sqlite:test.db";
			Connection c = DriverManager.getConnection(url);
					
		} catch (InstantiationException | IllegalAccessException
				| ClassNotFoundException | SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
}
```

Da ich noch nicht so richtig in das Konzept von RAP einsteigen konnte (keine guten Übersichten oder Einführungen in die Platform), ist meine Frage ob Ihr welche kennt. 

Vielleicht tummeln sich hier sogar Leute, die eine Idee haben, wo das Problem ist.

Gruß,
Zitrone


----------



## dzim (10. Dez 2014)

Also es stimmt, das die Doku zu RAP bestenfalls dünn ist - wie bei vielen aus der Eclipse-Welt, was ich extrem schade finde, denn RAP hat IMHO durchaus potential. Aber lassen wir das Beiseite.

Dein Problem sieht schon von der Fehlermeldung her nicht so aus als ob es etwas mit RAP zu tun hätte.
Was für einen JDBC-Treiber für SQLite verwendest du? Ich musste bei dem von Xerial keine vorgelagerte Treiberregistrierung machen, nur die Verbindung aufbauen...
Ich vermute einfach, das dein JAR-File mit dem Treiber nicht richtig beim Build gebundelt wurde und dir somit der angeforderte JDBC-Treiber schlicht und einfach fehlt. Schau noch mal, das dort alles richtig konfiguriert wurde.


----------



## zitrone18 (11. Dez 2014)

Erstmal danke für deine Antwort,



dzim hat gesagt.:


> Ich vermute einfach, das dein JAR-File mit dem Treiber nicht richtig beim Build gebundelt wurde und dir somit der angeforderte JDBC-Treiber schlicht und einfach fehlt. Schau noch mal, das dort alles richtig konfiguriert wurde.



Davon, dass man jar-Files in das Projekt einbinden muss, hab ich schon gelesen. Wie man das macht, ist mir allerdings weiterhin ein Rätsel...


----------



## dzim (12. Dez 2014)

Frage: Eclipse-Projekt, hoffe ich doch? (Ich würde dir bei solchen Applikationen von einer rein im Editor geschriebenen Anwendung abraten und eine IDE verwenden - da RAP aus der Eclipse-Welt kommt, würde ich hier auch Eclipse wählen).



Unter der Annahme, dass du nun Eclipse verwendest:

1) Erstelle, wenn noch nicht zuvor gemacht, den Ordner "libs" in deinem Projekt
2) Kopiere den Datenbanktreiber deiner DB (hier also den SQLite-Trieber)
3) Ist es ein OSGi-Bundle oder ein einfaches Java-Projekt?
3.1) OSGi: Öffne dein Manifest (META_INF/MANIFEST.MF) -> in dem speziellen Editor kannst du im Tab "Runtime" (Achtung, die Tabs sind unten) auf der rechten unteren Seite etwas zum Classpath hinzufügen ("Add..."). Wähle nun das Jar-File aus. Fertig. (Es kann sein, dass du später noch einmal im Tab "Build" den Ordner links unten - "Binary Build" - hinzufügen müsstest.)
3.2) Java-Projekt: Projekt-Einstellungen öffnen (Projekt anklicken und Alt+Enter oder Kontextmenü ganz unten "Properties"). "Java Build Path" wählen. Dann den Tab "Libraries". "Add JARs...", dein Projekt anwählen und aufklappen, und die JAR aus dem "libs"-Verzeichnis wählen. Fertig.



Wenn du immer noch den Editor verwendest, musst du die Jar zum Classpath hinzufügen. Dazu gibt es auf der Kommandozeile den Parameter "-cp" (":" als Trenner)


----------



## zitrone18 (12. Dez 2014)

Hallo dzim,

danke für die kurze Anleitung. Ich habe es nun mit Schritt 3.2 gemacht (also als Java-Projekt).
Ich danke dir sehr. Es läuft nun. Schade, dass es keine sauberen Tutorials oder Dokumentationen für sowas gibt.

Gruß,
zitrone


----------



## dzim (13. Dez 2014)

Gibt es schon:
Eclipse IDE Tutorials

Das Problem ist eher, das du hier nicht die Doku/Tutorial-Vielfalt (bzw. deren Fehlen) von RAP mit der von "Wie benutze ich Eclipse richtig" vergleichen kannst. Zu Eclipse findest du unendlich viel (wenn du nach den richtigen Stichworten suchst, natürlich). Bei RAP sieht es etwas anders aus - zum Glück nutzt es für die Basics Das Grundgerüst von SWT, so dass man sich einen soliden Stand erarbeiten kann. Erst die Feinheiten und das Deployment sind by RAP am Ende komplizierter.


----------

