Ich versuche, auf eine schreibgeschützte Embedded Derby-Datenbank zuzugreifen. Sie ist als myDB.jar verfügbar. Dieses Jar enthält einen Ordner der Apache Derby-Datenbank - myDB (Ordner log und seg0 sowie die Datei service.properties). Dieser Code funktioniert gut, wenn ich ihn aus einer Datei mit einer main-Methode ausführe. Wenn ich ihn jedoch in ein EAR-Paket packe und auf dem Server einsetze, tritt ein Fehler auf.
Diese Datenbank wird mit einer EAR-Datei verpackt und auf einem JBoss 5.0.1-Server bereitgestellt.
Die EAR hat folgenden Inhalt: - myWebApp.war - myEjbs.jar - myDB.jar - META-INF/MANIFEST.MF und META-INF/application.xml
Inhalt von MANIFEST.MF: Manifest-Version: 1.0 Klassen-Pfad: myDB.jar
myDB.jar ist nicht in application.xml registriert
EJB-JAR, d.h. myEjbs.jar, hat den folgenden Inhalt: - derby.properties - META-INF/MANIFEST.MF und andere wie persistence.xml, usw. Inhalt von MANIFEST.MF: Manifest-Version: 1.0 Klassen-Pfad: myDB.jar - com.xxx.common.DbUtility.class, die den folgenden Code für den Zugriff auf die Datenbank enthält:
private static String dbURL = "jdbc:derby:jar:(myDB.jar)";
private static String dbName = "myDB";
private static String user = "";
private static String password = "";
Connection con = DriverManager.getConnection(dbURL+ dbName, user, password);
Die Ausgabe dieser Klasse wird dann von den EJBs im Paket com.xxx.ejbs verwendet.
Ich erhalte die folgende Fehlermeldung:
INFO Geladener Datenbanktreiber: org.apache.derby.jdbc.EmbeddedDriver
INFO SQLException: Fehler beim Starten der Datenbank 'jar:(myDB.jar)myDB' mit dem Klassenlader BaseClassLoader@127627{vfsfile:/C:/jboss-5.0.1.GA/server/default/conf/jboss-service.xml}, siehe die nächste Ausnahme für Details.
INFO java.sql.SQLException: Fehler beim Starten der Datenbank 'jar:(myDB.jar)myDB' mit dem Klassenlader BaseClassLoader@127627{vfsfile:/C:/jboss-5.0.1.GA/server/default/conf/jboss-service.xml}, siehe die nächste Ausnahme für Details.
INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unbekannte Quelle)
INFO [STDOUT] (http-127.0.0.1-8080-1) at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unbekannte Quelle)
INFO at java.sql.DriverManager.getConnection(DriverManager.java:582)
INFO at java.sql.DriverManager.getConnection(DriverManager.java:185)
INFO Verursacht durch: java.sql.SQLException: Fehler beim Starten der Datenbank 'jar:(myDB.jar)myDB' mit dem Klassenlader BaseClassLoader@127627{vfsfile:/C:/jboss-5.0.1.GA/server/default/conf/jboss-service.xml}, siehe die nächste Ausnahme für Details.
INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source)
INFO Verursacht durch: java.sql.SQLException: Java-Ausnahme: 'myDB.jar (Das System kann die angegebene Datei nicht finden): java.io.FileNotFoundException'.
INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unbekannte Quelle)
INFO at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
INFO at org.apache.derby.impl.jdbc.Util.javaException(Unknown Source)
INFO Verursacht durch: java.io.FileNotFoundException: myDB.jar (Das System kann die angegebene Datei nicht finden)
INFO at java.util.zip.ZipFile.open(Native Methode)
INFO at java.util.zip.ZipFile.<init>(ZipFile.java:114)
INFO at java.util.zip.ZipFile.<init>(ZipFile.java:131)
INFO at org.apache.derby.impl.io.JarStorageFactory.doInit(Unbekannte Quelle)
INFO at org.apache.derby.impl.io.BaseStorageFactory.init(Unbekannte Quelle)
Ich danke Ihnen für Ihre Antwort. Ich habe nun Folgendes versucht:
(I)
String path = getClass().getClassLoader().getResource("myDB.jar").getPath();
System.out.println("Path found = " + path);
private static String dbURL = "jdbc:derby:jar:" + "(" + path + ")";
private static String dbName = "myDB";
private static String user = "";
private static String password = "";
Connection con = DriverManager.getConnection(dbURL+dbName, user, password);
Es wird immer noch derselbe Fehler angezeigt. Nachfolgend finden Sie das Serverprotokoll.
INFO Pfad gefunden = /C:/jboss-5.0.1.GA/server/default/deploy/Main.ear/myDB.jar/
INFO Geladener Datenbanktreiber: org.apache.derby.jdbc.EmbeddedDriver
INFO SQLException: Fehler beim Starten der Datenbank 'jar:(/C:/jboss-5.0.1.GA/server/default/deploy/Main.ear/myDB.jar/)myDB' mit dem Klassenlader BaseClassLoader@e6c6d7{vfsfile:/C:/jboss-5.0.1.GA/server/default/conf/jboss-service.xml}, siehe die nächste Ausnahme für Details.
INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unbekannte Quelle)
INFO Verursacht durch: java.sql.SQLException: Java-Ausnahme: ' C:\jboss -5.0.1.GA \server\default\deploy\Main.ear\ myDB.jar (Das System kann den angegebenen Pfad nicht finden): java.io.FileNotFoundException'.
INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unbekannte Quelle)
INFO Verursacht durch: java.io.FileNotFoundException: C:\jboss -5.0.1.GA \server\default\deploy\Main.ear\ myDB.jar (Das System kann den angegebenen Pfad nicht finden)
INFO at java.util.zip.ZipFile.open(Native Methode)
INFO at java.util.zip.ZipFile.(ZipFile.java:114)
INFO at java.util.zip.ZipFile.(ZipFile.java:131)
INFO at org.apache.derby.impl.io.JarStorageFactory.doInit(Unbekannte Quelle)
Die folgende Ausgabe wird angezeigt, wenn die Klassen von JBoss anfänglich geladen werden:
BaseClassLoader@a75818{vfszip:/C:/jboss-5.0.1.GA/server/default/deploy/Main.ear/} mit Richtlinie VFSClassLoaderPolicy@88a588{name=vfszip:/C:/jboss-5.0.1.GA/server/default/deploy/Main. ear/ domain=null roots=[MemoryContextHandler@19639558[path= context=vfsmemory://ak42v-bfhwq-ger46v84-1-ger477uj-20 real=vfsmemory://ak42v-bfhwq-ger46v84-1-ger477uj-20], DelegatingHandler@7111491[path=Main. ear context=file:/C:/jboss-5.0.1.GA/server/default/deploy/ real=file:/C:/jboss-5. 0.1.GA/server/default/deploy/Main.ear], DelegatingHandler@1948811[path=Main.ear/myEJBs.jar context=file:/C:/jboss-5.0.1.GA/server/default/deploy/ real=file:/C:/jboss-5.0.1.GA/server/default/deploy/Main.ear/myEJBs. jar], DelegatingHandler@4545587[path=Main.ear/ myDB.jar context=file:/C:/jboss-5.0.1.GA/server/default/deploy/ real=file:/C:/jboss-5. 0.1.GA/server/default/deploy/Main.ear/ myDB.jar], com.xxx.common, com.xxx.ejb, myDB, myDB.seg0, META-INF, myDB.log,
Es sieht also so aus, als ob myDB.jar im Klassenpfad liegt und der Datenbankordner myDB ebenfalls geladen ist.
(II)
Dann habe ich Folgendes versucht:
private static String dbURL\_nfdc = "jdbc:derby:/";
private static String dbName = "myDB";
private static String user = "";
private static String password = "";
Connection con = DriverManager.getConnection(dbURL+dbName, user, password);
Ich erhalte wieder eine Fehlermeldung, aber jetzt bekomme ich keine FileNotFoundException:
INFO java.sql.SQLException: Datenbank '/myDB' nicht gefunden.
INFO Verursacht durch: java.sql.SQLException: Datenbank '/myDB' nicht gefunden.
Sieht so aus, als hätten Sie mich auf den richtigen Weg gebracht, aber ich kann den Grund für diesen Fehler nicht finden.
(III)
Ich habe auch Folgendes versucht:
private static String dbURL\_nfdc = "jdbc:derby:"; (No / )
private static String dbName = "myDB";
private static String user = "";
private static String password = "";
Connection con = DriverManager.getConnection(dbURL+dbName, user, password);
Aber ich erhalte die gleiche SQLException.
Ist es möglich, dass JBoss myDB als ein Java-Paket und nicht als einen einfachen Dateiordner behandelt?
Das Folgende hat funktioniert:
private static String dbURL\_nfdc = "jdbc:derby:classpath:/";
private static String dbName = "myDB";
private static String user = "";
private static String password = "";
Connection con = DriverManager.getConnection(dbURL+dbName, user, password);
Vielen Dank, dass Sie mich auf den richtigen Weg gebracht haben. Ich weiß Ihre Hilfe zu schätzen!!!