Ошибке типа 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 ответ:
Задача должна находиться внутриEmbeddedEngine . Ошибка не удалось инициализировать класс означает, что некоторые статические инициализации класса не работает. Смотрите этот связанный Вопрос noclassdeffounderror-could-not-initialize-class-error .
Я предлагаю запустить karaf в режиме отладки и выполнить отладку через инициализацию этого класса.