Skip to content

OSGi - javassist.NotFoundException: org.msgpack.template.builder.JavassistTemplateBuilder$JavassistTemplate #57

@christian-sahlmann

Description

@christian-sahlmann

I am trying to use msgpack-java as an OSGi bundle.
In OSGi, each bundle has its own classloader. In my case, these are 3 different ones: one for msgpack, one for javassist and one for my own bundle.

So when trying to use msgpack as it is, I get this exception:

javassist.NotFoundException: org.msgpack.template.builder.JavassistTemplateBuilder$JavassistTemplate
    at javassist.ClassPool.get(ClassPool.java:450)
    at org.msgpack.template.builder.JavassistTemplateBuilder.getCtClass(JavassistTemplateBuilder.java:103)
    at org.msgpack.template.builder.DefaultBuildContext.setSuperClass(DefaultBuildContext.java:60)
    at org.msgpack.template.builder.BuildContext.buildClass(BuildContext.java:92)
    at org.msgpack.template.builder.BuildContext.build(BuildContext.java:61)
    ... 44 more

When I try to tell msgpack to use the classloader which can find this class

msgpack.setClassLoader(JavassistTemplateBuilder.class.getClassLoader());

I get a bit further, but still get an exception:

compile error: no such class: de.cbuehler.messages.Message
    at javassist.compiler.MemberResolver.searchImports(MemberResolver.java:468)
    at javassist.compiler.MemberResolver.lookupClass(MemberResolver.java:412)
    at javassist.compiler.MemberResolver.lookupClassByJvmName(MemberResolver.java:319)
    at javassist.compiler.MemberResolver.resolveJvmClassName(MemberResolver.java:512)
    at javassist.compiler.MemberCodeGen.resolveClassName(MemberCodeGen.java:1145)
    at javassist.compiler.CodeGen.atDeclarator(CodeGen.java:712)
    at javassist.compiler.ast.Declarator.accept(Declarator.java:100)
    at javassist.compiler.CodeGen.atStmnt(CodeGen.java:351)
    at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
    at javassist.compiler.CodeGen.atStmnt(CodeGen.java:351)
    at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
    at javassist.compiler.CodeGen.atMethodBody(CodeGen.java:292)
    at javassist.compiler.Javac.compileBody(Javac.java:223)
    at javassist.CtBehavior.setBody(CtBehavior.java:438)
    ... 48 more

My workaround now is to patch msgpack

--- a/src/main/java/org/msgpack/template/builder/JavassistTemplateBuilder.java
+++ b/src/main/java/org/msgpack/template/builder/JavassistTemplateBuilder.java
@@ -21,6 +21,7 @@ import java.lang.reflect.Type;
 import java.util.logging.Level;
 import java.util.logging.Logger;

+import javassist.ClassClassPath;
 import javassist.ClassPool;
 import javassist.CtClass;
 import javassist.LoaderClassPath;
@@ -59,6 +60,7 @@ public class JavassistTemplateBuilder extends AbstractTemplate
     public JavassistTemplateBuilder(TemplateRegistry registry, ClassLoader cl) 
         super(registry);
         pool = new ClassPool();
+        pool.appendClassPath(new ClassClassPath(getClass()));
         boolean appended = false;
         loader = cl;
         if (loader == null) {

and use

msgpack.setClassLoader(Message.class.getClassLoader());

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions