# Firebird NoClassDefFoundError trotz erfolgreichem Class.forName(...) unter Linux



## SchlechterInformatiker (20. Okt 2009)

Hallo,
mein Java-Programm soll sich mit einer Firebird Datenbank, die auf einem Rechner im lokalen Netzwerk liegt verbinden. Solange sich mein Java-Programm hier auf meinem Windows-Rechner befindet und läuft, funktioniert das ganze. Muss sich wohl um ein Linux-Problem handeln oder? Kennt sich da jemand aus?

Hier der Inhalt der Funktion, die letztendlich aufgerufen wird:

[java=352]
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
String query = "";
try 
{
	System.out.print("Lade Klasse...");
	Class.forName("org.firebirdsql.jdbc.FBDriver");
	System.out.println("ok.");
	System.out.print("Verbinde mit Datenbank im lokalen Netzwerk...");
	con = DriverManager.getConnection(db_URL,db_User,db_PW);
	System.out.println("ok.");
	stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

	query = "SELECT * FROM Personen";
			rs = stmt.executeQuery(query);

			//...
} 
catch (SQLException e)
{

	System.out.println(query + "\n\n");
	e.printStackTrace(System.out);
	throw e;
}
catch (ClassNotFoundException e) 
{
	e.printStackTrace();
}
[/code]


Und hier die Ausgabe in der Konsole:


```
Lade Klasse...ok.
Verbinde mit Datenbank im lokalen Netzwerk...Exception in thread "Thread-3" java.lang.NoClassDefFoundError: org.firebirdsql.jdbc.FBConnection
   at java.lang.Class.initializeClass(libgcj.so.81)
   at java.lang.Class.forName(libgcj.so.81)
   at java.lang.Class.forName(libgcj.so.81)
   at org.firebirdsql.gds.ClassFactory.get(ClassFactory.java:61)
   at org.firebirdsql.gds.impl.wire.WireGDSFactoryPlugin.getConnectionClass(WireGDSFactoryPlugin.java:29)
   at org.firebirdsql.gds.impl.GDSFactory.getConnectionClass(GDSFactory.java:334)
   at org.firebirdsql.jca.FBManagedConnectionFactory.newConnection(FBManagedConnectionFactory.java:826)
   at org.firebirdsql.jca.FBManagedConnection.getConnection(FBManagedConnection.java:482)
   at org.firebirdsql.jca.FBStandAloneConnectionManager.allocateConnection(FBStandAloneConnectionManager.java:73)
   at org.firebirdsql.jdbc.FBDataSource.getConnection(FBDataSource.java:119)
   at org.firebirdsql.jdbc.FBDriver.connect(FBDriver.java:131)
   at java.sql.DriverManager.getConnection(libgcj.so.81)
   at java.sql.DriverManager.getConnection(libgcj.so.81)
   at VerbindungsAufbauThread.getMapping(Test.java:362)
   at VerbindungsAufbauThread.run(Test.java:251)
Caused by: java.lang.ClassNotFoundException: java.sql.SQLClientInfoException not found in gnu.gcj.runtime.SystemClassLoader{urls=[file:/home/Test/lib/jaybird-full-2.1.5.jar,file:/home/Test/bin/], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}}
   at java.net.URLClassLoader.findClass(libgcj.so.81)
   at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.81)
   at java.lang.ClassLoader.loadClass(libgcj.so.81)
   at java.lang.ClassLoader.loadClass(libgcj.so.81)
   at java.lang.Class.forName(libgcj.so.81)
   at java.lang.Class.initializeClass(libgcj.so.81)
   ...14 more
```


Wie man erkennen kann, geht die Zeile mit dem *Class.forName* ohne Probleme durch, aber erst bei *con = DriverManager.getConnection(db_URL,db_User,db_PW);* kommt die Exception.

Weiß jemand Rat?

MfG


----------



## maki (20. Okt 2009)

> gnu.gcj.runtime.


Du nutzt nicht die SUN JRE, versuche mal [c]update-alternatives --config java[/c] und [c]update-alternatives --config javac[/c] als Root und stelle die Sun Varianten als Standard ein.
Falls diese nicht installiert sind, ist das der nächste Schritt


----------



## SchlechterInformatiker (20. Okt 2009)

Oha!!!

Es gibt mehrere Anbieter bei denen man Java laufen lassen kann??? Dieses Linux ist echt eine andere Welt! Wer installiert denn mehrere verschiedene Java's auf einem Rechner??? Ich meine... ok, ich hab unter Windows auch noch Ordner herumliegen mit Java 1.5.xx aber ich wechsel in Linux ausdrücklich in das Verzeichnis von SUN und führe dort das Java aus. Dass der sich dann trotzdem eines anderen Java's bedient, da wär ich erst recht nie drauf gekommen!!!

Jetzt kommt wenigstens die Meldung, "Bad version number in .class file". Ich wollte schon den post hier editieren und fragen wieso ich unter Windows diese Meldung bekomme, wenn ich versuche mein Java 1.6 Programm mit java 1.5 aufzurufen, aber unter Linux niemand meckert... 

Also ich denke ich weiß was jetzt noch zu tun ist -> Java 1.6 auf die Linux-Kiste.

Vielen Dank @ maki !!!


----------



## maki (20. Okt 2009)

Was für ein Linux? Ubuntu/Debian?
Dann [c]sudo apt-get install openjdk-6-jdk[/c].

OpenJDK: Download and install


----------



## SchlechterInformatiker (20. Okt 2009)

Als absoluter Linux-Nichtskönner hab ichs hinbekommen das Java 1.6 zu installieren. 

Eine unglaubliche Verkettung ungünstiger Umstände! Weißt was des Rätsels Lösung eigentlich war? Ein fehlendes "./" vor dem Aufruf von Java in der Shell... daher nahm er auch das falsche Java, führte es aber trotzdem aus. Komischerweise ohne Versions-Check. Kompiliert wurde es hier auf Windows mit 1.6, aber ausgeführt von GNU? mit Version 1.5

Hab viel gelernt heute...

Danke nochmals!


----------



## maki (20. Okt 2009)

> Kompiliert wurde es hier auf Windows mit 1.6, aber ausgeführt von GNU?


Deswegen hab ich geschrieben einmal die Konfig für die JVM und dann für das JDK auszuführen, [c]java[/c] und  [c]javac[/c] sind eben 2 paar Schuhe.


----------

