2

我正在尝试访问只读的 Embedded Derby 数据库。它以 myDB.jar 的形式提供。这个 jar 有一个 Apache Derby 数据库的文件夹 - myDB(log 和 seg0 文件夹以及 service.properties 文件)。当我使用 main 方法从文件运行时,此代码可以正常工作。但是,当我将它打包到 EAR 中并将其部署到服务器上时,它会出错。

该数据库与 EAR 文件一起打包并部署在 JBoss 5.0.1 服务器上。

EAR 包含以下内容: • myWebApp.war • myEjbs.jar • myDB.jar • META-INF/MANIFEST.MF 和 META-INF/application.xml

MANIFEST.MF 的内容:Manifest-Version: 1.0 Class-Path: myDB.jar

myDB.jar 未在 application.xml 中注册

EJB-JAR 即 myEjbs.jar 有以下内容: • derby.properties • META-INF/MANIFEST.MF 和其他如persistence.xml 等。 MANIFEST.MF 的内容: Manifest-Version: 1.0 Class-Path: myDB .jar • com.xxx.common.DbUtility.class,具有以下访问数据库的代码:

私有静态字符串 dbURL = "jdbc:derby:jar:(myDB.jar)";
私有静态字符串 dbName = "myDB";
私有静态字符串用户=“”;
私人静态字符串密码=“”;

Connection con = DriverManager.getConnection(dbURL+ dbName, user, password);

此类的输出随后被 com.xxx.ejbs 包中的 EJB 使用。

以下是我得到的错误:

INFO 加载的数据库驱动程序:org.apache.derby.jdbc.EmbeddedDriver

INFO SQLException: 无法使用类加载器 BaseClassLoader@127627{vfsfile:/C:/jboss-5.0.1.GA/server/default/conf/jboss-service.xml} 启动数据库 'jar:(myDB.jar)myDB' ,请参阅下一个例外以了解详细信息。

INFO java.sql.SQLException: 无法使用类加载器 BaseClassLoader@127627{vfsfile:/C:/jboss-5.0.1.GA/server/default/conf/jboss- 启动数据库 'jar:(myDB.jar)myDB' service.xml},有关详细信息,请参阅下一个异常。

org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException 上的信息(未知来源)

org.apache.derby.impl.jdbc.Util.newEmbedSQLException 上的信息 [STDOUT] (http-127.0.0.1-8080-1)(来源未知)

java.sql.DriverManager.getConnection 处的信息(DriverManager.java:582)

java.sql.DriverManager.getConnection 处的信息(DriverManager.java:185)

信息原因:java.sql.SQLException:无法使用类加载器 BaseClassLoader@127627{vfsfile:/C:/jboss-5.0.1.GA/server/default/conf 启动数据库 'jar:(myDB.jar)myDB' /jboss-service.xml},详见下一个例外。

org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException 上的信息(未知来源)

org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA 上的信息(未知来源)

INFO 原因:java.sql.SQLException:Java 异常:'myDB.jar(系统找不到指定的文件):java.io.FileNotFoundException'。

org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException 上的信息(未知来源)

org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException 上的信息(未知来源)

org.apache.derby.impl.jdbc.Util.newEmbedSQLException 上的信息(未知来源)

org.apache.derby.impl.jdbc.Util.javaException 处的信息(未知来源)

INFO Caused by: java.io.FileNotFoundException: myDB.jar (系统找不到指定的文件)

java.util.zip.ZipFile.open 处的信息(本机方法)

java.util.zip.ZipFile.<init>(ZipFile.java:114) 处的信息

java.util.zip.ZipFile.<init>(ZipFile.java:131) 处的信息

org.apache.derby.impl.io.JarStorageFactory.doInit 上的信息(未知来源)

org.apache.derby.impl.io.BaseStorageFactory.init 上的信息(未知来源)


感谢你的回复。我现在尝试了以下方法:

(我)

字符串路径 = getClass().getClassLoader().getResource("myDB.jar").getPath();
System.out.println("找到的路径 = " + path);
私有静态字符串 dbURL = "jdbc:derby:jar:" + "(" + path + ")";
私有静态字符串 dbName = "myDB";
私有静态字符串用户=“”;
私人静态字符串密码=“”;

Connection con = DriverManager.getConnection(dbURL+dbName, user, password);

它仍然给出同样的错误。以下是服务器日志。

找到的信息路径 = /C:/jboss-5.0.1.GA/server/default/deploy/Main.ear/myDB.jar/

INFO 加载的数据库驱动程序:org.apache.derby.jdbc.EmbeddedDriver

INFO SQLException: 无法使用类加载器 BaseClassLoader@e6c6d7{vfsfile:/ 启动数据库 'jar:(/C:/jboss-5.0.1.GA/server/default/deploy/Main.ear/myDB.jar/)myDB' C:/jboss-5.0.1.GA/server/default/conf/jboss-service.xml},详见下一个异常。

org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException 上的信息(未知来源)

INFO Caused by: java.sql.SQLException: Java exception: 'C:\jboss-5.0.1.GA\server\default\deploy\Main.ear\ myDB.jar (系统找不到指定的路径): java. io.FileNotFoundException'。

org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException 上的信息(未知来源)

INFO Caused by: java.io.FileNotFoundException: C:\jboss-5.0.1.GA\server\default\deploy\Main.ear\ myDB.jar(系统找不到指定的路径)

java.util.zip.ZipFile.open 处的信息(本机方法)

java.util.zip.ZipFile.(ZipFile.java:114) 处的信息

java.util.zip.ZipFile.(ZipFile.java:131) 处的信息

org.apache.derby.impl.io.JarStorageFactory.doInit 上的信息(未知来源)


以下是 JBoss 最初加载类时的输出:

BaseClassLoader@a75818{vfszip:/C:/jboss-5.0.1.GA/server/default/deploy/Main.ear/} 策略 VFSClassLoaderPolicy@88a588{name=vfszip:/C:/jboss-5.0.1.GA /server/default/deploy/Main.ear/ domain=null 根=[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, ...

所以看起来 myDB.jar 在类路径中,并且数据库文件夹 myDB 也已加载。

(二)

然后我尝试了以下方法:

私有静态字符串 dbURL_nfdc = "jdbc:derby:/";
私有静态字符串 dbName = "myDB";
私有静态字符串用户=“”;
私人静态字符串密码=“”;

Connection con = DriverManager.getConnection(dbURL+dbName, user, password);

我再次收到错误,但是,现在我没有收到 FileNotFoundException:

信息 java.sql.SQLException:找不到数据库“/myDB”。

信息原因:java.sql.SQLException:找不到数据库“/myDB”。

看起来您已经为我指明了正确的方向,但是,我无法找到此错误的原因。

(三)

我还尝试了以下方法:

私有静态字符串 dbURL_nfdc = "jdbc:derby:"; (不 / )
私有静态字符串 dbName = "myDB";
私有静态字符串用户=“”;
私人静态字符串密码=“”;

Connection con = DriverManager.getConnection(dbURL+dbName, user, password);

但是,得到相同的 SQLException。

JBoss 是否有可能将 myDB 视为 java 包而不是简单的文件夹?

以下工作:

私有静态字符串 dbURL_nfdc = "jdbc:derby:classpath:/";
私有静态字符串 dbName = "myDB";
私有静态字符串用户=“”;
私人静态字符串密码=“”;

Connection con = DriverManager.getConnection(dbURL+dbName, user, password);

非常感谢您带领我朝着正确的方向前进。感谢你的帮助!!!

4

1 回答 1

0

由于您的数据库 jar 在同一个 EJB ear 包中,我认为它应该在“类路径中”,因此您应该尝试遵循http://db.apache.org上文档的“在类路径中”部分/derby/docs/10.6/devguide/cdevdvlp24155.html#cdevdvlp24155

也就是说,我认为您不想使用“jar”子协议。

或者,如果您要使用“jar”子协议,那么我认为括号内的部分应该是您的 ejb ear 文件的完整文件系统路径。

于 2010-09-30T03:10:56.133 回答