无法从部署在 JBoss 服务器上的 EAR 文件内访问只读嵌入式 Derby 数据库
我正在尝试访问只读嵌入式 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 的内容: 清单版本:1.0 类路径:myDB.jar
myDB.jar 未在 application.xml 中注册
EJB-JAR即myEjbs.jar具有以下内容: • 德比.属性 • META-INF/MANIFEST.MF 和其他,例如 persistence.xml 等。 MANIFEST.MF 的内容: 清单版本:1.0 类路径:myDB.jar • com.xxx.common.DbUtility.class 具有以下访问数据库的代码:
private static String dbURL = "jdbc:derby:jar:(myDB.jar)"; private static String dbName = "myDB"; private static String user = ""; private static String password = "";连接 con = DriverManager.getConnection(dbURL+ dbName, 用户, 密码);
然后,com.xxx.ejbs 包中的 EJB 使用该类的输出。
以下是我得到的错误:
信息加载的数据库驱动程序:org.apache.derby.jdbc.EmbeddedDriver
信息 SQLException:无法使用类加载器 BaseClassLoader@127627{vfsfile:/C:/jboss-5.0.1.GA/server/default/conf/jboss-service.xml} 启动数据库 'jar:(myDB.jar)myDB' ,请参阅下一个异常以了解详细信息。
信息 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(来源未知)
信息 [STDOUT] (http-127.0.0.1-8080-1) 位于 org.apache.derby.impl.jdbc.Util.newEmbedSQLException(来源未知)
信息位于 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(来源未知)
信息 导致: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.
信息位于 java.util.zip.ZipFile.
信息位于 org.apache.derby.impl.io.JarStorageFactory.doInit(来源未知)
信息位于 org.apache.derby.impl.io.BaseStorageFactory.init(来源未知)
感谢你的回复。我现在已尝试以下操作:
(我)
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 = "";连接 con = DriverManager.getConnection(dbURL+dbName, 用户, 密码);
它仍然给出相同的错误。以下是服务器日志。
找到信息路径 = /C:/jboss-5.0.1.GA/server/default/deploy/Main.ear/myDB.jar/
信息加载的数据库驱动程序:org.apache.derby.jdbc.EmbeddedDriver
信息 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异常: '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/ 域=null 根=[MemoryContextHandler@19639558[路径= 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[路径=Main.ear/myEJBs.jar context=文件:/C:/jboss-5.0.1.GA/server/default/部署/真实=文件:/C:/jboss-5.0.1.GA/server/default/deploy/Main.ear/myEJBs.jar],DelegatingHandler@4545587[路径=Main.ear/myDB.jar上下文=文件: /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 也已加载。
(二)
然后我尝试了以下操作:
private static String dbURL_nfdc = "jdbc:derby:/"; private static String dbName = "myDB"; private static String user = ""; private static String password = "";连接 con = DriverManager.getConnection(dbURL+dbName, 用户, 密码);
我再次收到错误,但是现在我没有收到 FileNotFoundException:
信息 java.sql.SQLException:未找到数据库“/myDB”。
信息 导致:java.sql.SQLException:未找到数据库“/myDB”。
看起来您已经为我指出了正确的方向,但是,我无法找到此错误的原因。
(三)
我还尝试了以下方法:
private static String dbURL_nfdc = "jdbc:derby:"; (No / ) private static String dbName = "myDB"; private static String user = ""; private static String password = "";连接 con = DriverManager.getConnection(dbURL+dbName, 用户, 密码);
但是,得到相同的 SQLException。
JBoss 有可能将 myDB 视为 java 包而不是简单的文件夹吗?
以下工作有效:
private static String dbURL_nfdc = "jdbc:derby:classpath:/"; private static String dbName = "myDB"; private static String user = ""; private static String password = "";连接 con = DriverManager.getConnection(dbURL+dbName, 用户, 密码);
非常感谢您引导我走向正确的方向。感谢您的帮助!
I am trying to access a read-only Embedded Derby database. It is available as myDB.jar. This jar has one folder of the Apache Derby database - myDB (log and seg0 folders and service.properties file). This code works fine when I run from a file with a main method. But, when I package it into EAR and deploy it on server it gives error.
This database is packaged with EAR file and deployed on JBoss 5.0.1 server.
The EAR has following contents:
• myWebApp.war
• myEjbs.jar
• myDB.jar
• META-INF/MANIFEST.MF and META-INF/application.xml
Contents of MANIFEST.MF:
Manifest-Version: 1.0
Class-Path: myDB.jar
myDB.jar is not registered in application.xml
EJB-JAR i.e. myEjbs.jar has the following contents:
• derby.properties
• META-INF/MANIFEST.MF and others such as persistence.xml, etc.
Contents of MANIFEST.MF:
Manifest-Version: 1.0
Class-Path: myDB.jar
• com.xxx.common.DbUtility.class that has the following code accessing the database:
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);
The output of this class is then used by the EJBs in com.xxx.ejbs package.
Following is the error I get:
INFO Loaded database driver: org.apache.derby.jdbc.EmbeddedDriver
INFO SQLException: Failed to start database 'jar:(myDB.jar)myDB' with class loader BaseClassLoader@127627{vfsfile:/C:/jboss-5.0.1.GA/server/default/conf/jboss-service.xml}, see the next exception for details.
INFO java.sql.SQLException: Failed to start database 'jar:(myDB.jar)myDB' with class loader BaseClassLoader@127627{vfsfile:/C:/jboss-5.0.1.GA/server/default/conf/jboss-service.xml}, see the next exception for details.
INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
INFO [STDOUT] (http-127.0.0.1-8080-1) at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
INFO at java.sql.DriverManager.getConnection(DriverManager.java:582)
INFO at java.sql.DriverManager.getConnection(DriverManager.java:185)
INFO Caused by: java.sql.SQLException: Failed to start database 'jar:(myDB.jar)myDB' with class loader BaseClassLoader@127627{vfsfile:/C:/jboss-5.0.1.GA/server/default/conf/jboss-service.xml}, see the next exception for details.
INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source)
INFO Caused by: java.sql.SQLException: Java exception: 'myDB.jar (The system cannot find the file specified): java.io.FileNotFoundException'.
INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
INFO at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
INFO at org.apache.derby.impl.jdbc.Util.javaException(Unknown Source)
INFO Caused by: java.io.FileNotFoundException: myDB.jar (The system cannot find the file specified)
INFO at java.util.zip.ZipFile.open(Native Method)
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(Unknown Source)
INFO at org.apache.derby.impl.io.BaseStorageFactory.init(Unknown Source)
Thank you for your reply. I have now tried the following:
(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);
It still gives the same error. Following is the server log.
INFO Path found = /C:/jboss-5.0.1.GA/server/default/deploy/Main.ear/myDB.jar/
INFO Loaded database driver: org.apache.derby.jdbc.EmbeddedDriver
INFO SQLException: Failed to start database 'jar:(/C:/jboss-5.0.1.GA/server/default/deploy/Main.ear/myDB.jar/)myDB' with class loader BaseClassLoader@e6c6d7{vfsfile:/C:/jboss-5.0.1.GA/server/default/conf/jboss-service.xml}, see the next exception for details.
INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
INFO Caused by: java.sql.SQLException: Java exception: 'C:\jboss-5.0.1.GA\server\default\deploy\Main.ear\ myDB.jar (The system cannot find the path specified): java.io.FileNotFoundException'.
INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
INFO Caused by: java.io.FileNotFoundException: C:\jboss-5.0.1.GA\server\default\deploy\Main.ear\ myDB.jar (The system cannot find the path specified)
INFO at java.util.zip.ZipFile.open(Native Method)
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(Unknown Source)
Following is the output when classes are being loaded by JBoss initially:
BaseClassLoader@a75818{vfszip:/C:/jboss-5.0.1.GA/server/default/deploy/Main.ear/} with policy 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, …
So it looks like the myDB.jar is in the classpath and the database folder myDB is also loaded.
(II)
Then I tried the following:
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);
I again get an error, but, now I do not get the FileNotFoundException:
INFO java.sql.SQLException: Database '/myDB' not found.
INFO Caused by: java.sql.SQLException: Database '/myDB' not found.
Looks like you have pointed me in the right direction, but, I am not able to find the reason for this error.
(III)
I also tried the following:
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);
But, get the same SQLException.
Is it possible that JBoss is treating myDB as a java package and not a simple file folder?
The following worked:
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);
Thank you so much for leading me in the right direction. Appreciate your help!!!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
由于您的数据库 jar 位于同一个 EJB Ear 包内,因此我认为它应该位于“类路径中”,因此您应该尝试遵循 http://db.apache.org/derby/docs/10.6/devguide/cdevdvlp24155.html#cdevdvlp24155< /a>.
也就是说,我认为您不想使用“jar”子协议。
或者,如果您要使用“jar”子协议,那么我认为括号内的部分应该是您的 ejb Ear 文件的完整文件系统路径。
Since your database jar is inside your same EJB ear package, I think it is supposed to be "in the classpath", so you should try following the "in the classpath" section of the docs at http://db.apache.org/derby/docs/10.6/devguide/cdevdvlp24155.html#cdevdvlp24155.
That is, I don't think you want to use the "jar" sub-protocol.
Alternatively, if you are going to use the "jar" sub-protocol, then I think that the part inside the parentheses should be the full filesystem path of your ejb ear file.