Я пытаюсь получить доступ к базе данных Embedded Derby только для чтения. Он доступен как myDB.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, имеет следующее содержимое:
• derby.properties
• 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 = "";</p>
<p>Connection con = DriverManager.getConnection(dbURL+ dbName, user, password);
Выходные данные этого класса затем используются EJB в пакете com.xxx.ejbs.
Вот ошибка, которую я получаю:
ИНФОРМАЦИЯ Загруженный драйвер базы данных: org.apache.derby.jdbc.EmbeddedDriver
INFO SQLException: Не удалось запустить базу данных 'jar: (myDB.jar) myDB' с загрузчиком классов BaseClassLoader @ 127627 {vfsfile: / C: /jboss-5.0.1.GA/server/default/conf/jboss-service.xml} см. следующее исключение для деталей.
ИНФОРМАЦИЯ java.sql.SQLException: не удалось запустить базу данных 'jar: (myDB.jar) myDB' с загрузчиком классов BaseClassLoader @ 127627 {vfsfile: / C: /jboss-5.0.1.GA/server/default/conf/jboss- 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: Не удалось запустить базу данных 'jar: (myDB.jar) myDB' с загрузчиком классов BaseClassLoader @ 127627 {vfsfile: / C: /jboss-5.0.1.GA/server/default/conf /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 (неизвестный источник)
ИНФОРМАЦИЯ Причина: java.io.FileNotFoundException: 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 (неизвестный источник)
ИНФОРМАЦИЯ на 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 = "";</p>
<p>Connection con = DriverManager.getConnection(dbURL+dbName, user, password);
Это все еще дает ту же ошибку. Ниже приведен журнал сервера.
INFO Path found = /C:/jboss-5.0.1.GA/server/default/deploy/Main.ear/myDB.jar/
ИНФОРМАЦИЯ Загружен dДрайвер atabase: org.apache.derby.jdbc.EmbeddedDriver
INFO SQLException: Не удалось запустить базу данных 'jar: (/ C: /jboss-5.0.1.GA/server/default/deploy/Main.ear/myDB.jar/) myDB' с загрузчиком классов BaseClassLoader @ e6c6d7 {vfsfile: / C: /jboss-5.0.1.GA/server/default/conf/jboss-service.xml}, подробности смотрите в следующем исключении.
ИНФОРМАЦИЯ на org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException (неизвестный источник)
ИНФОРМАЦИЯ Причина: 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 (Неизвестный источник)
ИНФОРМАЦИЯ Причина: 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 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 [путь = 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 также загружена.
(II),
Тогда я попробовал следующее:
private static String dbURL_nfdc = "jdbc:derby:/";
private static String dbName = "myDB";
private static String user = "";
private static String password = "";</p>
<p>Connection con = DriverManager.getConnection(dbURL+dbName, user, password);
Я снова получаю сообщение об ошибке, но теперь я не получаю FileNotFoundException:
ИНФОРМАЦИЯ java.sql.SQLException: База данных '/ myDB' не найдена.
ИНФОРМАЦИЯ Причина: java.sql.SQLException: База данных '/ myDB' не найдена.
Похоже, вы указали мне правильное направление, но я не могу найти причину этой ошибки.
(III),
Я также попробовал следующее:
private static String dbURL_nfdc = "jdbc:derby:"; (No / )
private static String dbName = "myDB";
private static String user = "";
private static String password = "";</p>
<p>Connection con = DriverManager.getConnection(dbURL+dbName, user, password);
Но получите то же исключение SQLE.
Возможно ли, что JBoss рассматривает myDB как пакет java, а не как простую файловую папку?
Сработало следующее:
private static String dbURL_nfdc = "jdbc:derby:classpath:/";
private static String dbName = "myDB";
private static String user = "";
private static String password = "";</p>
<p>Connection con = DriverManager.getConnection(dbURL+dbName, user, password);
Большое спасибо за то, что привели меня в правильном направлении. Ценю твою помощь!!!