-
Notifications
You must be signed in to change notification settings - Fork 321
Closed
Description
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