Hi, although this is rather off-topic and should be discussed inside the Activiti community rather than the general OSGi development list, I personally have worked with Activiti inside OSGi.
The key is to get your classes "visible" to the bundle that created the Job Executor (so most likely the engine). A simple way is to provide your classes as Fragment Bundle(s) and attach them to the engine Bundle as the host. This way, the engine class-loader will get expanded with your classes. Alternatively, you'd have to modify the engine Bundle and add Dynamic-Imports (which are really deprecated) and have your Bundle export the packages of your listener classes. Doesn't Activiti pick up OSGi services registered as a TaskListener? That would actually be the proper way of integrating inside a service-oriented platform like OSGi. Cheers, Ancoron On 24/09/18 18:49, Mohamed AFIF via osgi-dev wrote: > Hello ALL, > > I'm facing an issue, and I don't know how to solve it, indeed In our > project we 're using activiti in karaf , and this is my problematic, > > 1- I have bundle A who exposes a webservice using cxf say that the > webservice class is MyAWebService, and we have a bundle B which contains > class MyBWebService the sub class of MyAWebService > (MyAWebService extends MyBWebService ). > > 2- in our activiti process we define a Listner > MyTaskListner(implementing TaskListner) as Class it means it will be > instanciated by Activiti engine. > the class listner islocated in bundle B. > > Thus when I run my workflow, and when activiti try to instanciate > MyTaskListner, it throws "can't instanciate...." which is in the real > NoClassFoundException, > because the classloader trying to load this class cna not get it, and > this is why, indeed activiti , because of the ClassDelegate of activit > when it runs its method > notify, it trys to instanciate MyTaskListner, and thus to load it using > the org.activiti.engine.impl.util.ReflectUtil.loadClass() method (code > below) > so my problem is that Thread.currentThread().getContextClassLoader() > returns a BundleDelegatingClassLoader on bundle A , which not contains > MyTaskListner class. > > 1-so my first question is what BundleDelegatingClassLoader does really? > 2- which workaround could I use to force the > BundleDelegatingClassLoader to looks to my bundle B > > Thanks a lot for your Help > > public static Class<?> loadClass(String className) { > Class<?> clazz = null; > ClassLoader classLoader = getCustomClassLoader(); > > // First exception in chain of classloaders will be used as cause > when no class is found in any of them > Throwable throwable = null; > > if(classLoader != null) { > try { > LOG.trace("Trying to load class with custom classloader: {}", > className); > clazz = loadClass(classLoader, className); > } catch(Throwable t) { > throwable = t; > } > } > if(clazz == null) { > try { > LOG.trace("Trying to load class with current thread context > classloader: {}", className); > clazz = loadClass(Thread.currentThread().getContextClassLoader(), > className); > } catch(Throwable t) { > if(throwable == null) { > throwable = t; > } > } > if(clazz == null) { > try { > LOG.trace("Trying to load class with local classloader: {}", > className); > clazz = loadClass(ReflectUtil.class.getClassLoader(), className); > } catch(Throwable t) { > if(throwable == null) { > throwable = t; > } > } > } > } > > if(clazz == null) { > throw new ActivitiClassLoadingException(className, throwable); > } > return clazz; > } > > > > > _______________________________________________ > OSGi Developer Mail List > osgi-dev@mail.osgi.org > https://mail.osgi.org/mailman/listinfo/osgi-dev > _______________________________________________ OSGi Developer Mail List osgi-dev@mail.osgi.org https://mail.osgi.org/mailman/listinfo/osgi-dev