JDBC Oracle в OSGI консьерж - PullRequest
       13

JDBC Oracle в OSGI консьерж

0 голосов
/ 26 октября 2018

Мне нужно кое-что понять, как использовать ojdbc8 (я пробовал с ojdbc6, ojdbc7 также никогда не работал), развернутый как OSGi Bundle, я мог загрузить класс с помощью Class.load (), однако я получаю следующую ошибку при запуске:

java.net.MalformedURLException: unknown protocol: bundle
    at java.net.URL.<init>(URL.java:421)
    at java.net.URL.<init>(URL.java:310)
    at java.net.URL.<init>(URL.java:333)
    at org.eclipse.concierge.BundleImpl$Revision.createURL(BundleImpl.java:2460)
    at org.eclipse.concierge.BundleImpl$JarBundleRevision.findFile(BundleImpl.java:3633)
    at org.eclipse.concierge.BundleImpl$JarBundleRevision.lookupFile(BundleImpl.java:3587)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findOwnResources(BundleImpl.java:3220)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findResource1(BundleImpl.java:2747)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findResource0(BundleImpl.java:2685)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findResource(BundleImpl.java:2541)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.getResource(BundleImpl.java:2517)
    at java.lang.ClassLoader.getResourceAsStream(ClassLoader.java:1307)
    at java.lang.Class.getResourceAsStream(Class.java:2223)
    at oracle.jdbc.driver.SQLStateMapping.doGetMappings(SQLStateMapping.java:208)
    at oracle.jdbc.driver.SQLStateMapping.getMappings(SQLStateMapping.java:194)
    at oracle.jdbc.driver.DatabaseError.<clinit>(DatabaseError.java:1075)
    at oracle.jdbc.driver.OracleDiagnosabilityMBean.getDescription(OracleDiagnosabilityMBean.java:96)
    at javax.management.StandardMBean.getMBeanInfo(StandardMBean.java:456)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getNewMBeanClassName(DefaultMBeanServerInterceptor.java:333)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:319)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522)
    at oracle.jdbc.driver.OracleDriver.registerMBeans(OracleDriver.java:409)
    at oracle.jdbc.driver.OracleDriver$1.run(OracleDriver.java:241)
    at java.security.AccessController.doPrivileged(Native Method)
    at oracle.jdbc.driver.OracleDriver.<clinit>(OracleDriver.java:237)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at java.sql.DriverManager.isDriverAllowed(DriverManager.java:556)
    at java.sql.DriverManager.getConnection(DriverManager.java:661)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at nz.co.spark.cg.shared.sql.SQLUtils.getDBConnection(SQLUtils.java:19)
    at nz.co.spark.cg.shared.sql.SQLUtils.createLocalDB(SQLUtils.java:29)
    at nz.co.spark.cg.extractor.task.ChatExtractorJob.<init>(ChatExtractorJob.java:61)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at org.quartz.simpl.SimpleJobFactory.newJob(SimpleJobFactory.java:56)
    at org.quartz.simpl.PropertySettingJobFactory.newJob(PropertySettingJobFactory.java:69)
    at org.quartz.core.JobRunShell.initialize(JobRunShell.java:127)
    at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:375)
java.net.MalformedURLException: unknown protocol: bundle
    at java.net.URL.<init>(URL.java:421)
    at java.net.URL.<init>(URL.java:310)
    at java.net.URL.<init>(URL.java:333)
    at org.eclipse.concierge.BundleImpl$Revision.createURL(BundleImpl.java:2460)
    at org.eclipse.concierge.BundleImpl$JarBundleRevision.findFile(BundleImpl.java:3633)
    at org.eclipse.concierge.BundleImpl$JarBundleRevision.lookupFile(BundleImpl.java:3587)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findOwnResources(BundleImpl.java:3220)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findResource1(BundleImpl.java:2747)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findResource0(BundleImpl.java:2685)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findResource(BundleImpl.java:2541)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.getResource(BundleImpl.java:2517)
    at java.lang.ClassLoader.getResourceAsStream(ClassLoader.java:1307)
    at java.util.ResourceBundle$Control$1.run(ResourceBundle.java:2686)
    at java.util.ResourceBundle$Control$1.run(ResourceBundle.java:2671)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.util.ResourceBundle$Control.newBundle(ResourceBundle.java:2670)
    at java.util.ResourceBundle.loadBundle(ResourceBundle.java:1510)
    at java.util.ResourceBundle.findBundle(ResourceBundle.java:1474)
    at java.util.ResourceBundle.findBundle(ResourceBundle.java:1428)
    at java.util.ResourceBundle.findBundle(ResourceBundle.java:1428)
    at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1370)
    at java.util.ResourceBundle.getBundle(ResourceBundle.java:782)
    at oracle.jdbc.driver.Message11.msg(Message11.java:36)
    at oracle.jdbc.driver.DatabaseError.findMessage(DatabaseError.java:939)
    at oracle.jdbc.driver.OracleDiagnosabilityMBean.getDescription(OracleDiagnosabilityMBean.java:96)
    at javax.management.StandardMBean.getMBeanInfo(StandardMBean.java:456)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getNewMBeanClassName(DefaultMBeanServerInterceptor.java:333)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:319)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522)
    at oracle.jdbc.driver.OracleDriver.registerMBeans(OracleDriver.java:409)
    at oracle.jdbc.driver.OracleDriver$1.run(OracleDriver.java:241)
    at java.security.AccessController.doPrivileged(Native Method)
    at oracle.jdbc.driver.OracleDriver.<clinit>(OracleDriver.java:237)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at java.sql.DriverManager.isDriverAllowed(DriverManager.java:556)
    at java.sql.DriverManager.getConnection(DriverManager.java:661)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at nz.co.spark.cg.shared.sql.SQLUtils.getDBConnection(SQLUtils.java:19)
    at nz.co.spark.cg.shared.sql.SQLUtils.createLocalDB(SQLUtils.java:29)
    at nz.co.spark.cg.extractor.task.ChatExtractorJob.<init>(ChatExtractorJob.java:61)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at org.quartz.simpl.SimpleJobFactory.newJob(SimpleJobFactory.java:56)
    at org.quartz.simpl.PropertySettingJobFactory.newJob(PropertySettingJobFactory.java:69)
    at org.quartz.core.JobRunShell.initialize(JobRunShell.java:127)
    at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:375)
java.net.MalformedURLException: unknown protocol: bundle
    at java.net.URL.<init>(URL.java:421)
    at java.net.URL.<init>(URL.java:310)
    at java.net.URL.<init>(URL.java:333)
    at org.eclipse.concierge.BundleImpl$Revision.createURL(BundleImpl.java:2460)
    at org.eclipse.concierge.BundleImpl$JarBundleRevision.findFile(BundleImpl.java:3633)
    at org.eclipse.concierge.BundleImpl$JarBundleRevision.lookupFile(BundleImpl.java:3587)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findOwnResources(BundleImpl.java:3220)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findResource1(BundleImpl.java:2747)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findResource0(BundleImpl.java:2685)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findResource(BundleImpl.java:2541)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.getResource(BundleImpl.java:2517)
    at java.lang.ClassLoader.getResourceAsStream(ClassLoader.java:1307)
    at java.lang.Class.getResourceAsStream(Class.java:2223)
    at oracle.jdbc.driver.OracleDriver.<clinit>(OracleDriver.java:323)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at java.sql.DriverManager.isDriverAllowed(DriverManager.java:556)
    at java.sql.DriverManager.getConnection(DriverManager.java:661)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at nz.co.spark.cg.shared.sql.SQLUtils.getDBConnection(SQLUtils.java:19)
    at nz.co.spark.cg.shared.sql.SQLUtils.createLocalDB(SQLUtils.java:29)
    at nz.co.spark.cg.extractor.task.ChatExtractorJob.<init>(ChatExtractorJob.java:61)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at org.quartz.simpl.SimpleJobFactory.newJob(SimpleJobFactory.java:56)
    at org.quartz.simpl.PropertySettingJobFactory.newJob(PropertySettingJobFactory.java:69)
    at org.quartz.core.JobRunShell.initialize(JobRunShell.java:127)
    at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:375)

То, что происходит внутри драйвера oracle jdbc, в классе SQLStateMapping, класс пытается получить файл ресурсов, используя SQLStateMapping.class.getResourceAsStream ("error..xml");

Это происходит потому, что внутри пакета OSGi он изменяет URL-адрес, вставляя в него слово «пакет», и ресурс никогда не возвращается правильно, выбрасывая исключение java.net.MalformedURLException.Кто-нибудь знает, как решить это?

1 Ответ

0 голосов
/ 11 ноября 2018

Если вы хотите использовать JDBC в OSGi, я рекомендую вам использовать ( PAX-JDBC ).Он делает все необходимое, чтобы зарегистрировать DataSourceFactory из драйверов JDBC, и если вы используете сервис ConfigAdmin, вы можете также зарегистрировать DataSource-s.Когда я использую библиотеку, которая может обрабатывать соединение JDBC или DataSource, я получаю экземпляр от служб OSGi и использую его.Преимущества этого: вы также можете использовать пул соединений, PAX-JDBC поддерживает его из коробки.Если документация не ясна, я могу расширить этот ответ на некотором примере, но для начала есть хороший учебник .Он основан на karaf, но может быть адаптирован в любой стандартной реализации OSGi.

...