繁体   English   中英

捆绑服务组合:未找到org.sqlite.JDBC

[英]Bundle on service mix: org.sqlite.JDBC not found

我有与SQLite数据库一起使用的应用程序。 我把它打包成捆绑,我可以看到服务组合上的服务。 当我向Post或Get服务发送请求时,我收到此错误:

java.lang.ClassNotFoundException:找不到org.sqlite.JDBC

我在servicemix上安装了SQLite JDBC驱动程序但仍然出错。

这是我的POM:

<modelVersion>4.0.0</modelVersion>

<groupId>asd</groupId>
<artifactId>name</artifactId>
<version>0.0.1-SNAPSHOT</version>

<packaging>bundle</packaging>
<name>Name</name>
<description>Bundle Desc</description>

<dependencies>
    <dependency>
        <groupId>org.xerial</groupId>
        <artifactId>sqlite-jdbc</artifactId>
        <version>3.15.1</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-core</artifactId>
        <version>3.1.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>3.1.5</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <version>3.3.0</version>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                    <Bundle-Description>${project.description}</Bundle-Description>
                    <Import-Package>
                        javax.jws,
                        javax.wsdl,
                        javax.xml.namespace,
                        org.apache.cxf.helpers,
                        org.osgi.service.blueprint,
                        org.xerial.sqlite-jdbc,
                        *
                    </Import-Package>
                    <Export-Package>
                        my.services.package,
                        org.xerial.sqlite-jdbc
                    </Export-Package>
                </instructions>
            </configuration>
        </plugin>
    </plugins>
</build>

我试图将此org.xerial.sqlite-jdbc仅作为Export包并仅作为Import包但未成功。

这是SQLite连接的java代码:

private void getConnection() throws ClassNotFoundException, SQLException {
    Class.forName("org.sqlite.JDBC");
    con = DriverManager.getConnection("jdbc:sqlite:SQLiteTest1.db");
    initialise();
}

该应用程序在本地运行,但不在servicemix上运行。

您的java代码不适合OSGi。 默认情况下,在OSGi中,每个类都由它所在的包的类加载器加载。

所以你自己的类是由你的bundle的类加载器加载的。 由于您有org.sqlite的Import-Package语句,因此您的代码可以访问sqlite驱动程序类。

问题是DriverManager本身加载了类。 DriverManager由系统包(felix框架包)提供。 这个捆绑当然没有sqllite的Import-Package。 所以它无法加载这个类。

但是有一个简单的解决方法。 DriverManager允许您设置线程上下文类加载器。 您可以将此类加载器设置为您自己的包的类加载器。 这样DriverManager就可以看到sqllite类。 这只是一种解决方法。

在OSGi中,避免问题的野兽方法是不直接加载任何类。 在jdbc的情况下,这可以通过使用DriverManager的DataSource类intead来完成。 这篇文章

另一种选择是使用pax-jdbc。 它允许从config创建DataSource服务。 这样,您可以使捆绑包独立于实际的DB驱动程序,并且仍然可以避免手动加载类。 看这个例子

你可以尝试这样:

private void getConnection() throws ClassNotFoundException, SQLException {
  SQLiteDataSource ds = new SQLiteDataSource();
  ds.setUrl("jdbc:sqlite:SQLiteTest1.db");
  try {
   con = ds.getConnection();
   System.out.println("Connected.");
  } catch (Exception e) {
   e.printStackTrace();
  }
  initialise();
 }

根据@Christian Schneider的说法,这可以通过使用DataSource来完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM