2017-04-20 6 views
2

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 ..

enter image description here

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

enter image description here

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 { 
}} 
+0

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? –

+0

@ChristianSchneider J'ai ajouté le code ci-dessus – larnouch

+0

@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

Répondre

3

Le problème doit être à l'intérieur EmbeddedEngine. L'erreur n'a pas pu initialiser la classe signifie qu'une initialisation statique de la classe n'a pas fonctionné. Voir cette question connexe noclassdeffounderror-could-not-initialize-class-error.

Je propose d'exécuter karaf en mode débogage et de déboguer à travers l'initialisation de cette classe.

+0

Merci pour la réponse, mais pourriez-vous répondre à ces questions ? pourquoi les erreurs d'initialisation statique ne se sont produites que lorsque je l'ai exécuté sur karaf et que cela ne s'est pas produit lorsque je l'ai exécuté avec une application Java autonome? Est-ce que cela signifie que debezium n'est pas compatible avec l'environnement osgi? – larnouch

+0

Oui. Je pense que debezium n'est actuellement pas compatible avec OSGi. Je suppose qu'ils ont des hypothèses sur le chargement des classes qui ne fonctionnent pas dans OSGi. Je pense que vous devriez ouvrir un problème dans leur problème de suivi sur le problème. –

+0

Les JAR de Debezium n'ont pas de manifestes OSGi puisque IIRC aucune de nos dépendances de bibliothèques tierces ne les possède non plus. N'hésitez pas à enregistrer un problème pour ajouter des manifestes OSGi aux fichiers JAR, bien que vous souhaitiez envisager de contribuer aux modifications via une demande d'extraction pour accélérer les choses. –