Je travaille avec OSGi sur apache karaf et je suis en train d'utiliser kafka et debezium pour exécuter dans un environnement osgi.NoClassDefFoundError dans un environnement OSGi
kafka et debezium n'étaient pas osgi prêt (karaf ne les considérer comme des paquets), donc je n'osgified les utiliser Eclipse "projet Plug-in". Les pots que j'ai osgifiés sont les suivants: debezium-embedded, debezium-core, kafka connect-api, kafka connect-runtime.
Au début, je reçois beaucoup de « Classe non trouvé exception » lorsque je tente de lancer debezium ..
Pour résoudre ce problème, je l'ai changé le manifeste des deux faisceaux. J'ai ajouté un paquet d'importation à l'appelant et un paquet d'exportation au paquet appelé. En utilisant cela, je peux résoudre le problème classNotFound.
Après avoir résolu tous les problèmes de ClassNotFound, je reçois NoClassDefFoundError
NoClassDefFoundError signifie que le chargeur de classe n'a pas pu trouver le .class quand il essaie de les charger ... Mais je importaient tous les paquets et les exporter aussi.
Toute pensée comment traiter avec NoClassDefFoundError dans un osgi environement
[EDIT Ajout de code]
Ceci est le moniteur de classe:
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();
}
}
Et mon activateur:
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 {
}}
L'erreur peut se produire si vous utilisez le mauvais classloader. Il semble que l'exception se produise dans la classe Monitor. Pouvez-vous poster les contenus pertinents? –
@ChristianSchneider J'ai ajouté le code ci-dessus – larnouch
@ChristianSchneider Le code ci-dessus a fonctionné quand je l'ai exécuté comme un pot autonome, mais les erreurs se produisent lorsque je tente de l'exécuter sur osgi karaf – larnouch