Использование SqLite JDBC Jar в проекте OSGi

Я пытаюсь изучить OSGi, и я сделал один простой проект, в котором он просто создаст таблицу в базе данных Sqlite. Я добавил «sqlite-jdbc-3.7.2.jar» в путь сборки. Но когда я запускаю этот проект, он говорит «ClassNotFoundException».

Я использую Eclipse IDE с BndTools.

Я искал другие сообщения, и некоторые люди сказали добавить банку в качестве другого пакета, а затем экспортировать его. Я пробовал. В рабочей области я выбрал «Импорт» -> «Плагины и фрагменты» -> «Выбрать каталог». Но он не отображает Jar (работает для других JAR, но не обнаруживает sqlite-jdbc-3.7.2.jar).

Я сделал, как показано ниже,

se.sample.sqlitedbconn.ConnActivator.java

  import java.sql.Connection;
  import java.sql.DriverManager;
  import java.sql.Statement;
  import org.osgi.framework.BundleActivator;
  import org.osgi.framework.BundleContext;
  import se.sample.connproperties.CreateTable;
  import aQute.bnd.annotation.component.*;

 @Component
 public class ConnActivator implements BundleActivator {

Connection connection;
Statement statement;

@Activate
public void start(BundleContext context) throws Exception {
    System.out.println("Starting");


    try {
        Class.forName("org.sqlite.JDBC");
        connection = DriverManager.getConnection("jdbc:sqlite://home/raj/Desktop/EclipseProjectsWorkspace/ZWave.db");
    } catch (Exception ex) {
        System.err.println(ex.getClass().getName()+": "+ex.getMessage());
    }

    System.out.println("Connection To Database Successful");

    CreateTable createTable = new CreateTable();
    statement = connection.createStatement();
    boolean isTableCreated = createTable.createANewTable(connection,statement);

        if(isTableCreated){
             System.out.println("Table Created Successfully!");
        }else{
             System.out.println("Table Creation Failed!");
        }

        statement.close();
    }

     @Deactivate
     public void stop(BundleContext context) throws Exception {
         System.out.println("Stopping");

        if(connection != null){
            connection.close();
        }

         System.out.println("Database Connection Closed!");
    }

 }

se.sample.connproperties.CreateTable.java

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

public class CreateTable {


     public boolean createANewTable(Connection connection, Statement statement) {
    String sql =    "CREATE TABLE Product " +
                    "(ProductId INT PRIMARY KEY  NOT NULL,"+
                    "ProductName TEXT NOT NULL,"+
                    "ProductPrice REAL);";
    try {
        statement.executeUpdate(sql);
    } catch (SQLException e) {
        System.err.println(e.getClass().getName()+": "+e.getMessage());
        return false;
    }
    return true;
   }

 }

Когда я запускаю это, я получаю следующую ошибку:

Starting
Connection To Database Successful
java.lang.ClassNotFoundException: org.sqlite.JDBC not found by se.sample.sqlitedbconn [8]
! Failed to start bundle se.sample.sqlitedbconn-0.0.0.201503241305, exception activator error null from: se.sample.sqlitedbconn.ConnActivator:start#34
 ____________________________
 Welcome to Apache Felix Gogo

 g! 

Пожалуйста помоги мне с этим :)


person Rajkishan Swami    schedule 24.03.2015    source источник
comment
Кто-нибудь может помочь мне в этом, пожалуйста?   -  person Rajkishan Swami    schedule 25.03.2015
comment
Вы нашли решение или все еще ищете   -  person Raj    schedule 11.12.2015
comment
@Rajkishan, ребята, вы нашли способ решить эту проблему?   -  person Ashok    schedule 04.05.2016
comment
@Ashok: Сейчас мы используем BndTools. Вы можете добавить банку sqllite в папку lib и добавить ее в путь сборки в bnd.bnd вручную. Что-то вроде -buildpath: \ osgi.core,\ osgi.cmpn,\ biz.aQute.bnd.annotation,\ lib/sqllitexxx.jar;version=file. Он должен работать. Извините, я не знаю больше об этом, так как старший парень создал для нас Framework, и мы используем его сейчас.   -  person Rajkishan Swami    schedule 05.05.2016
comment
@Rajkishan Я пробовал то же самое, это не работает, как вы думаете, мне нужно использовать отдельный файл Jar, который может поддерживать OSGi !?   -  person Ashok    schedule 25.05.2016
comment
@Ashok: вы можете попробовать использовать версию jar sqllite 3.8.11.2. Как упоминалось в ответе, эта версия упакована как Bundle. Попробуйте, может сработает.   -  person Rajkishan Swami    schedule 25.05.2016
comment
@Rajkishan Пробовал с sqlite-jdbc-3.8.11.2.jar все та же ошибка   -  person Ashok    schedule 25.05.2016
comment
@Ashok: Ну тогда ... если вы еще этого не сделали, вы можете попробовать переупаковать банку в виде пакета. stackoverflow.com/questions/29494485/   -  person Rajkishan Swami    schedule 25.05.2016
comment
@Ashok: Хотел бы я помочь вам с этим, но у меня нет доступа к коду, написанному нашими старшими :(. Мы просто используем пакет как API, и все.   -  person Rajkishan Swami    schedule 25.05.2016


Ответы (2)


Пожалуйста, взгляните на отличный учебник по OSGi здесь, он очень хорошо описывает подключение к базе данных и OSGi.

С наилучшими пожеланиями

person Tom    schedule 19.05.2015

DriverManager использует загрузчик классов OSGI (поскольку вызывающий объект загружается из контейнера OSGI). Поскольку org.sqlite.JDBC не виден загрузчику классов OSGI, возникает исключение ClassNotFoundException.

Версия 3.8.11.2 SQLite JDBC теперь является пакетом OSGI, поэтому, если вы развертываете jar SQLite JDBC как пакет OSGI, а не встроенный jar вашего пакета, он должен работать.

person Z0RrO    schedule 13.05.2016
comment
Я попытался добавить пакет SQlite с помощью github.com/bndtools/ bndtools/wiki/How-to-Wrap-Bundles, но не действует. Проблема остается той же - person Ashok; 25.05.2016