【问题标题】:MySQL Connector in OSGi Environment (Gradle): NoClassDefFoundErrorOSGi 环境 (Gradle) 中的 MySQL 连接器:NoClassDefFoundError
【发布时间】:2015-05-18 15:32:02
【问题描述】:

我正在尝试使用 OSGi-Bundle 中的 mysql-connector 连接到 MySQL 数据库。不幸的是,当我试图在我的包中获取数据库驱动程序时,我总是得到 NoClassDefFoundError。

我已经在这里坐了两天,头撞墙。我尝试了所有我发现的东西(我知道在 stackoverflow 上已经有类似的问题了)但我现在完全迷失了。

该项目是一个 gradle 项目,我正在使用 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-connector-java-5.1.35.jar 文件被 gradle 正确下载并添加为模块的依赖项:

这就是我尝试创建数据库连接的方式:

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
:

请帮忙:(

【问题讨论】:

    标签: java mysql intellij-idea osgi apache-felix


    【解决方案1】:

    哦,天哪,赞美太阳,我现在开始工作了。我不知道是这样做的还是有更好的方法,但这就是我的做法:

    编辑: 如果您下载 mysql-connector-java-5.1.35-bin.jar 它应该可以开箱即用,因为它已经是一个 OSGi-Bundle ...所以您可以跳过第 1 步) 2)

    1) 使用 JDBC 驱动程序创建一个 OSGi-Bundle(只需按照本教程进行操作: https://wiki.eclipse.org/Create_and_Export_MySQL_JDBC_driver_bundle) 步骤如下:

    • 下载mysql-connector-java-xxx-bin.jar
    • 打开 Eclipse(我使用过 Lunar SR2)-> 打开 新建项目向导从现有 JAR 文件中选择插件
    • 添加外部 JAR 并选择 mysql-connector jar
    • 添加以下信息:
    • 按完成并将项目导出为可部署的插件和片段(在导出向导中)
    • 之后应该创建一个 JAR 文件(例如 com.mysql.jdbc_5.1.6.jar)

    2) 现在解压缩创建的 JAR 文件并打开 META-INF 文件夹中的 MANIFEST.MF 并添加以下 Export-PackageImport-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
    

    导出的包可以被其他包使用(这就是重点)。 保存清单文件后,压缩所有内容并将文件扩展名更改为 .jar 并将 .jar 文件放入Felix OSGi 环境的 bundles 文件夹(或您使用的任何东西),重要的是捆绑包已安装并可用:

    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");
    }
    

    希望这对某人有所帮助,我花了两天时间弄清楚这些东西是如何工作的^^

    【讨论】:

    • 我确信这一切都不是必需的...... MySQL 连接器应该已经作为 OSGi 包提供。
    • 我现在已经用 5.1.35-bin.jar 对其进行了测试,是的,它开箱即用。所以步骤1和2是不必要的^^
    【解决方案2】:

    在将系统从 Jboss5.1 迁移到 Wildfly 10 时,我也遇到了这个错误

    分析后发现应该在受影响的module.xml中添加依赖<module name="javax.api"/>

    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 以获得类似的分辨率

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 2012-08-05
      • 2020-06-11
      • 1970-01-01
      相关资源
      最近更新 更多