Osgi环境中的NoClassDefFoundError
我正在ApacheKaraf上与osgi合作,并尝试使用kafka和debezium运行到osgi环境中Osgi环境中的NoClassDefFoundError,osgi,apache-kafka,karaf,debezium,Osgi,Apache Kafka,Karaf,Debezium,我正在ApacheKaraf上与osgi合作,并尝试使用kafka和debezium运行到osgi环境中 卡夫卡和DeBuZIE不是 OSGi准备< /St>(KARF不会把它们看作捆绑),所以我用Eclipse“插件项目”对它们进行了放大。我osgified给他们的JAR如下:debezium embedded、debezium core、kafka connect api、kafka connect运行时 一开始,当我尝试运行debezium时,我会遇到很多“类未发现异常” 为了解决这个问
卡夫卡和DeBuZIE不是<强> OSGi准备< /St>(KARF不会把它们看作捆绑),所以我用Eclipse“插件项目”对它们进行了放大。我osgified给他们的JAR如下:debezium embedded、debezium core、kafka connect api、kafka connect运行时
一开始,当我尝试运行debezium时,我会遇到很多“类未发现异常” 为了解决这个问题,我更改了两个bundle的清单。我向调用者添加了一个导入包,向被调用的bundle添加了一个导出包。使用它,我可以解决classNotFound问题 解决了所有classNotfound问题后,我得到了NoClassDefFoundError NoClassDefFoundError表示类装入器在尝试装入.class时找不到该类。。。但我确实导入了所有的软件包,并将其导出 如何在osgi环境中处理NoClassDefFoundError [编辑添加的代码] 这是班长: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();
}
}
问题一定在里面。该错误无法初始化类意味着该类的某些静态初始化无法工作。看这个相关的问题
我建议在调试模式下运行karaf,并通过初始化此类进行调试。如果使用错误的类加载器,可能会发生错误。看起来异常发生在类监视器中。你能发布相关内容吗?@ChristianSchneider我添加了代码above@ChristianSchneider当我将上面的代码作为一个独立的jar运行时,它是有效的,但是当我试图在osgi karafThanks上运行它以获得答案时,会出现错误,但是您能回答这些问题吗?为什么静态初始化错误只在karaf上运行时发生,而在java独立应用程序上运行时没有发生?这是否意味着debezium与osgi环境不兼容?是的。我认为debezium目前与OSGi不兼容。我猜他们对类加载的假设在OSGi中不起作用。我认为你应该在他们的问题跟踪器中打开一个关于这个问题的问题。Debezium JAR没有OSGi清单,因为IIRC也没有我们的第三方库依赖项有它们。可以自由地记录一个问题,以将OSGi清单添加到JAR中,尽管您可能想考虑通过拉请求来帮助更改,以加快进度。
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 {
}}