2015-05-18 4 views
1

Я пытаюсь использовать mysql-коннектор в OSGi-Bundle для подключения к базе данных MySQL. К сожалению, я всегда получаю NoClassDefFoundError, когда пытаюсь получить драйвер базы данных в своем пакете.Коннектор MySQL в среде OSGi (Gradle): NoClassDefFoundError

Я уже сижу здесь в течение двух дней, ударяя головой о стену. Я попробовал все, что нашел (я знаю, что есть аналогичные вопросы в stackoverflow), но я полностью потерял его.

Проект - проект градиента, и я использую Intellij. Вот build.gradle расслоения:

defaultTasks 'clean', 'build' 

apply plugin: 'java' 
apply plugin: 'osgi' 
apply plugin: 'maven' 

sourceCompatibility = 1.6 
targetCompatibility = 1.6 

version = '0.0.1' 

def bundleSymbolicName = 'at.my.test.drivers.mysqldb' 
def bundleName = 'Driver - MySql Database Drive' 

repositories { 
    mavenCentral() 
} 

configurations { 
    embed 
} 

dependencies { 
    compile group: 'org.osgi', name: 'org.osgi.core', version: '4.3.1' 
    compile group: 'org.osgi', name: 'org.osgi.compendium', version: '4.3.1' 
    compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.2' 

    compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.35' 
    embed group: 'mysql', name: 'mysql-connector-java', version: '5.1.35' 
} 

jar { 
    into('lib') { 
     from configurations.embed 
    } 
} 

jar { 
    manifest { 

     version = project.version.replace('-','.'); 
     symbolicName = bundleSymbolicName 
     name = bundleName 

     instruction 'Bundle-ClassPath', '.,lib/mysql-connector-java-5.1.35.jar' 
     instruction 'Service-Component', 'OSGI-INF/components.xml' 
    } 
} 

для MySQL-разъем-Java-5.1.35.jar файл запускается корректно загружен Gradle и добавляется в качестве зависимости модуля:

module settings Вот как я пытаюсь создать соединение с базой данных:

try { 

    Class.forName("com.mysql.jdbc.Driver").newInstance(); 
    sqlConnection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","usr","pwd"); 

} 
catch(Exception e) { 
    e.printStackTrace(); 
    logger.error("unable to create database connection"); 
} 

Когда я пытаюсь запустить модуль, я только получаю это исключение:

java.sql.SQLException: java.lang.NoClassDefFoundError: javax/naming/RefAddr 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:998) 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:937) 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926) 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:872) 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:904) 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:894) 
     at com.mysql.jdbc.Util.handleNewInstance(Util.java:407) 
     at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:399) 
     at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java 
: 

, пожалуйста, помогите: (

ответ

0

oh my gosh ПРОВАЙТЕ СОЛНЦЕ, Я получил его сейчас. Я не знаю, если это сделано таким образом, или если есть лучший способ, но это, как я сделал это:

EDIT: Если вы загрузите MySQL-разъем-Java-5.1.35-бен .jar он должен работать из коробки, поскольку он уже является OSGi-Bundle ... поэтому вы можете пропустить шаг 1) и 2)

1) Создайте OSGi-Bundle с драйвером JDBC (просто следуйте этот учебник: https://wiki.eclipse.org/Create_and_Export_MySQL_JDBC_driver_bundle) эти шаги:

  • Do Скачат ь MySQL-разъем-Java-ххх-bin.jar
  • Откройте Eclipse (я использовал Лунный SR2) -> открыть мастер New Project и выберите Вставные из существующих JAR архивы:
  • Добавить внешний JAR и выберите MySQL-разъем баночки
  • Добавить следующую информация: enter image description here
  • Нажмите Finish и экспортировать проект в качестве развертываемых плагин и фрагментов (в мастере экспорта)
  • После этого JAR- файл должен быть en created (например, com.mysql.jdbc_5.1.6.jar)

2) Теперь разархивируйте созданный файл JAR и откройте MANIFEST.MF в папке META-INF и добавьте следующие Export-Package и Импорт-пакета определения:

Export-Package: com.mysql.jdbc;version="5.1.35";uses:="com.mysql.jdbc. 
log,javax.naming,javax.net.ssl,javax.xml.transform,org.xml.sax",com.m 
ysql.jdbc.jdbc2.optional;version="5.1.35";uses:="com.mysql.jdbc,com.m 
ysql.jdbc.log,javax.naming,javax.sql,javax.transaction.xa",com.mysql. 
jdbc.log;version="5.1.35",com.mysql.jdbc.profiler;version="5.1.35";us 
es:="com.mysql.jdbc",com.mysql.jdbc.util;version="5.1.35";uses:="com. 
mysql.jdbc.log",com.mysql.jdbc.exceptions;version="5.1.35",com.mysql. 
jdbc.exceptions.jdbc4;version="5.1.35";uses:="com.mysql.jdbc",com.mys 
ql.jdbc.interceptors;version="5.1.35";uses:="com.mysql.jdbc",com.mysq 
l.jdbc.integration.c3p0;version="5.1.35",com.mysql.jdbc.integration.j 
boss;version="5.1.35",com.mysql.jdbc.configs;version="5.1.35",org.gjt 
.mm.mysql;version="5.1.35" 

Import-Package: javax.net,javax.net.ssl;version="[1.0.1, 2.0.0)";resol 
ution:=optional,javax.xml.parsers, javax.xml.stream,javax.xml.transfo 
rm,javax.xml.transform.dom,javax.xml.transform.sax,javax.xml.transfor 
m.stax,javax.xml.transform.stream,org.w3c.dom,org.xml.sax,org.xml.sax 
.helpers;resolution:=optional,javax.naming,javax.naming.spi,javax.sql 
,javax.transaction.xa;version="[1.0.1, 2.0.0)";resolution:=optional,c 
om.mchange.v2.c3p0;version="[0.9.1.2, 1.0.0)";resolution:=optional,or 
g.jboss.resource.adapter.jdbc;resolution:=optional,org.jboss.resource 
.adapter.jdbc.vendor;resolution:=optional 

мой полный файл манифеста выглядит следующим образом:

Manifest-Version: 1.0 
Ant-Version: Apache Ant 1.8.2 
Created-By: 1.5.0_22-b03 (Sun Microsystems Inc.) 
Built-By: pb2user 
Specification-Title: JDBC 
Specification-Version: 4.0 
Specification-Vendor: Oracle Corporation 
Implementation-Title: MySQL Connector Java 
Implementation-Version: 5.1.35 
Implementation-Vendor-Id: com.mysql 
Implementation-Vendor: Oracle 
Bundle-Vendor: Oracle Corporation 
Bundle-Classpath: . 
Bundle-Version: 5.1.35 
Bundle-Name: Oracle Corporation's JDBC Driver for MySQL 
Bundle-ManifestVersion: 2 
Bundle-SymbolicName: com.mysql.jdbc 
Export-Package: com.mysql.jdbc;version="5.1.35";uses:="com.mysql.jdbc. 
log,javax.naming,javax.net.ssl,javax.xml.transform,org.xml.sax",com.m 
ysql.jdbc.jdbc2.optional;version="5.1.35";uses:="com.mysql.jdbc,com.m 
ysql.jdbc.log,javax.naming,javax.sql,javax.transaction.xa",com.mysql. 
jdbc.log;version="5.1.35",com.mysql.jdbc.profiler;version="5.1.35";us 
es:="com.mysql.jdbc",com.mysql.jdbc.util;version="5.1.35";uses:="com. 
mysql.jdbc.log",com.mysql.jdbc.exceptions;version="5.1.35",com.mysql. 
jdbc.exceptions.jdbc4;version="5.1.35";uses:="com.mysql.jdbc",com.mys 
ql.jdbc.interceptors;version="5.1.35";uses:="com.mysql.jdbc",com.mysq 
l.jdbc.integration.c3p0;version="5.1.35",com.mysql.jdbc.integration.j 
boss;version="5.1.35",com.mysql.jdbc.configs;version="5.1.35",org.gjt 
.mm.mysql;version="5.1.35" 
Import-Package: javax.net,javax.net.ssl;version="[1.0.1, 2.0.0)";resol 
ution:=optional,javax.xml.parsers, javax.xml.stream,javax.xml.transfo 
rm,javax.xml.transform.dom,javax.xml.transform.sax,javax.xml.transfor 
m.stax,javax.xml.transform.stream,org.w3c.dom,org.xml.sax,org.xml.sax 
.helpers;resolution:=optional,javax.naming,javax.naming.spi,javax.sql 
,javax.transaction.xa;version="[1.0.1, 2.0.0)";resolution:=optional,c 
om.mchange.v2.c3p0;version="[0.9.1.2, 1.0.0)";resolution:=optional,or 
g.jboss.resource.adapter.jdbc;resolution:=optional,org.jboss.resource 
.adapter.jdbc.vendor;resolution:=optional 

Экспортируемые пакеты затем могут быть использованы другими связями (вот в чем смысл). После сохранения файла манифеста zip everthing и изменения расширения файла на .jar и поместите файл .jar в папку пачек среды Felix OSGi (или что бы вы ни использовали), важно, чтобы комплект был установлен и доступен :

enter image description here

3) После этого, вы можете импортировать пакет com.mysql.jdbc в любой другой связке вы создали, вам просто нужно сделать, импортировать пакет в манифесте:

Import-Package: com.mysql.jdbc;version="5.1.35" 

Или, если вы используете gradle, добавьте следующее в build.gradle:

jar { 
    manifest { 
     version = project.version.replace('-','.'); 
     symbolicName = bundleSymbolicName 
     name = bundleName 

     instruction 'Bundle-ClassPath', '.' 
     instruction 'Import-Package', 'com.mysql.jdbc;version="5.1.35"' 
     instruction 'Service-Component', 'OSGI-INF/components.xml' 
    } 
} 

4) и, наконец, вы можете использовать IST:

try { 

    Class.forName("com.mysql.jdbc.Driver").newInstance(); 
    sqlConnection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","usr","pwd"); 

} 
catch(Exception e) { 
    e.printStackTrace(); 
    logger.error("unable to create database connection"); 
} 

Надеется, что это поможет кому-то, я провожу два дня, выясняя, как работает этот материал ^^

+0

Я уверен, что все это не нужно ... коннектор MySQL должен быть доступен в качестве OSGi расслоения уже. –

+0

Теперь у меня есть тест 5.1.35-bin.jar, и да, это работает из коробки. Итак, шаги 1 и 2 не нужны ^ – Sepultura

0

Я также получил эту ошибку когда мигрирующая система от Jboss5.1 до Wildfly 10

После анализа мы обнаружили, что зависимую <module name="javax.api"/> следует добавить к затронутому модулю.xml

Module.xml

<module xmlns="urn:jboss:module:1.3" name="com.sql.mysql"> 

    <resources> 
     <resource-root path="mysql-connector-java-5.1.20.jar"/> 
    </resources> 

    <dependencies> 
     <module name="javax.api"/> 
     <module name="sun.jdk"/> 
    </dependencies> 

</module> 

См URL https://developer.jboss.org/thread/197723 для аналогичной резолюции

Смежные вопросы