Ошибке типа noclassdeffounderror в OSGi для окружающей среды


Я работаю с osgi на apache karaf и пытаюсь использовать kafka и debezium для запуска в среду osgi.

kafka иdebezium не былиosgi ready (караф не будет рассматривать их как связки), поэтому я сделал osgified их с помощью eclipse "Plug-in project". Банки, что я osgified них являются следующие : debezium-встроенный, debezium-сердечник, Кафка подключения-АФИ, Кафка подключения во время выполнения.

В начале я получаю много "Класс не нашел исключения", когда я пытаюсь запустить debezium..

Введите описание изображения здесь

Чтобы решить эту проблему, я изменил манифест двух пакетов. Я добавил пакет импорта к вызывающему объекту и пакет экспорта к вызываемому пакету. Используя это, я могу решить проблему classNotFound.

После решения всех проблем classNotfound я получаю NoClassDefFoundError

Введите описание изображения здесь

NoClassDefFoundError означает, что загрузчик класса не может найти.класс, когда он пытается загрузить их ... Но я действительно импортировал все пакеты и экспортировал их.

Любые мысли о том, как иметь дело с NoClassDefFoundError в среде osgi

[редактировать добавленный код]

Это монитор класса:

public class Monitor {
    private Consumer<SourceRecord> consumer = new Consumer<SourceRecord>() {

        public void accept(SourceRecord t) {
            System.out.println("Change Detected !");
        }

    };

    public void connect() {

        System.out.println("Engine Starting");
        Configuration config = Configuration.create()
                /* begin engine properties */
                .with("connector.class", "io.debezium.connector.mysql.MySqlConnector")
                .with("offset.storage", "org.apache.kafka.connect.storage.FileOffsetBackingStore")
                .with("offset.storage.file.filename", "d:/pathTooffset.dat")
                .with("offset.flush.interval.ms", 60000)
                /* begin connector properties */
                .with("name", "my-sql-connector").with("database.hostname", "localhost").with("database.port", 3306)
                .with("database.user", "root").with("database.password", "apassword").with("server.id", 10692)
                .with("database.server.name", "localhost")
                .with("database.history", "io.debezium.relational.history.FileDatabaseHistory")
                .with("database.history.file.filename", "d:/pathTOdbhistory.dat")
                .build();
        try {
            // Create the engine with this configuration ...
            EmbeddedEngine engine = EmbeddedEngine.create().using(config).notifying(consumer).build();
            Executor executor = Executors.newFixedThreadPool(1);

            executor.execute(() -> {
                engine.run();
            });
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

И мой активатор:

public class Activator implements BundleActivator {

public void start(BundleContext context) throws Exception {
    Monitor monitor = new Monitor();
    monitor.connect();
}

public void stop(BundleContext context) throws Exception {
}}
1 2

1 ответ:

Задача должна находиться внутриEmbeddedEngine . Ошибка не удалось инициализировать класс означает, что некоторые статические инициализации класса не работает. Смотрите этот связанный Вопрос noclassdeffounderror-could-not-initialize-class-error .

Я предлагаю запустить karaf в режиме отладки и выполнить отладку через инициализацию этого класса.