Classes in a WAR packaged inside an EAR are not visible to SwitchYard runtime
ajay.deshwal Dec 23, 2013 8:04 PMHello Everyone,
I am using switchyard for developing an application which consists of multiple modules / SwitchYard composites. My project structure consists of an EAR that wraps multiple jars and a couple of war modules. All modules are SwitchYard applications. The web module switchyard.xml looks like following:
<?xml version="1.0" encoding="UTF-8"?>
<switchyard xmlns="urn:switchyard-config:switchyard:1.0" xmlns:sy="urn:switchyard-config:switchyard:1.0" xmlns:bean="urn:switchyard-component-bean:config:1.0" xmlns:resteasy="urn:switchyard-component-resteasy:config:1.0" xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" name="myproject-api" targetNamespace="urn:com.example:myproject-api:1.0">
<sca:composite name="myproject-api" targetNamespace="urn:com.example:myproject-api:1.0">
<sca:component name="UserServiceComponet">
<bean:implementation.bean class="com.example.api.user.UserServiceImpl"/>
<sca:service name="UserService">
<sca:interface.java interface="com.example.api.user.UserService"/>
</sca:service>
<sca:reference name="UserFacade">
<sca:interface.java interface="com.example.api.user.UserFacade"/>
</sca:reference>
</sca:component>
<sca:component name="UserResource">
<bean:implementation.bean class="com.example.api.rest.user.UserResource"/>
<sca:reference name="UserService">
<sca:interface.java interface="com.example.api.user.UserService"/>
</sca:reference>
</sca:component>
<sca:reference name="UserFacade" multiplicity="0..1" promote="UserServiceComponet/UserFacade">
<sca:interface.java interface="com.example.api.user.UserFacade"/>
<sca:binding.sca sy:target="UserFacade" sy:targetNamespace="urn:com.example:myproject-core:1.0" name="UserFacade"/>
</sca:reference>
</sca:composite>
</switchyard>
Following is the error trace:
00:24:25,563 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-3) MSC000001: Failed to start service jboss.deployment.unit."myproject-ear.ear".WeldStartService: org.jboss.msc.service.StartException in service jboss.deployment.unit."myproject-ear.ear".WeldStartService: Failed to start service
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1767) [jboss-msc-1.0.4.GA-redhat-1.jar:1.0.4.GA-redhat-1]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_45]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_45]
at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_45]
Caused by: org.jboss.weld.exceptions.DefinitionException: Exception List with 1 exceptions:
Exception 0 :
java.lang.IllegalArgumentException: interface com.example.api.user.UserService is not visible from class loader
at java.lang.reflect.Proxy.getProxyClass0(Proxy.java:487)
at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:722)
at org.switchyard.component.bean.ClientProxyBean.<init>(ClientProxyBean.java:103)
at org.switchyard.component.bean.SwitchYardCDIServiceDiscovery.addClientProxyBean(SwitchYardCDIServiceDiscovery.java:174)
at org.switchyard.component.bean.SwitchYardCDIServiceDiscovery.addInjectableClientProxyBean(SwitchYardCDIServiceDiscovery.java:162)
at org.switchyard.component.bean.SwitchYardCDIServiceDiscovery.processBean(SwitchYardCDIServiceDiscovery.java:107)
at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.jboss.weld.util.reflection.SecureReflections$13.work(SecureReflections.java:267)
at org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:52)
at org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInvocation(SecureReflectionAccess.java:137)
at org.jboss.weld.util.reflection.SecureReflections.invoke(SecureReflections.java:263)
at org.jboss.weld.introspector.jlr.WeldMethodImpl.invokeOnInstance(WeldMethodImpl.java:170)
at org.jboss.weld.introspector.ForwardingWeldMethod.invokeOnInstance(ForwardingWeldMethod.java:51)
at org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:154)
at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:245)
at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:233)
at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:213)
at org.jboss.weld.event.ObserverNotifier.notifyObserver(ObserverNotifier.java:117)
at org.jboss.weld.event.TransactionalObserverNotifier.notifyObserver(TransactionalObserverNotifier.java:44)
at org.jboss.weld.event.ObserverNotifier.notifyObservers(ObserverNotifier.java:85)
at org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:75)
at org.jboss.weld.bootstrap.events.AbstractContainerEvent.fire(AbstractContainerEvent.java:60)
at org.jboss.weld.bootstrap.events.AbstractDefinitionContainerEvent.fire(AbstractDefinitionContainerEvent.java:38)
at org.jboss.weld.bootstrap.events.ProcessManagedBeanImpl.fire(ProcessManagedBeanImpl.java:30)
at org.jboss.weld.bootstrap.AbstractBeanDeployer.deploy(AbstractBeanDeployer.java:124)
at org.jboss.weld.bootstrap.BeanDeployment.deployBeans(BeanDeployment.java:217)
at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:357)
at org.jboss.as.weld.WeldStartService.start(WeldStartService.java:63)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
at org.jboss.weld.bootstrap.events.AbstractDefinitionContainerEvent.fire(AbstractDefinitionContainerEvent.java:40)
at org.jboss.weld.bootstrap.events.ProcessManagedBeanImpl.fire(ProcessManagedBeanImpl.java:30)
at org.jboss.weld.bootstrap.AbstractBeanDeployer.deploy(AbstractBeanDeployer.java:124)
at org.jboss.weld.bootstrap.BeanDeployment.deployBeans(BeanDeployment.java:217)
at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:357)
at org.jboss.as.weld.WeldStartService.start(WeldStartService.java:63)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.4.GA-redhat-1.jar:1.0.4.GA-redhat-1]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.4.GA-redhat-1.jar:1.0.4.GA-redhat-1]
... 3 more
00:24:25,890 INFO [org.jboss.as.server] (ServerService Thread Pool -- 27) JBAS018559: Deployed "myproject-ear.ear" (runtime-name : "myproject--ear.ear")
00:24:25,896 INFO [org.jboss.as.controller] (Controller Boot Thread) JBAS014774: Service status report
JBAS014775: New missing/unsatisfied dependencies:
service jboss.deployment.subunit."myproject-ear.ear"."myproject-webapp-0.0.1-SNAPSHOT.war".deploymentCompleteService (missing) dependents: [service jboss.deployment.unit."myproject-ear.ear".deploymentCompleteService]
JBAS014777: Services which failed to start: service jboss.deployment.unit."myproject--ear.ear".WeldStartService: org.jboss.msc.service.StartException in service jboss.deployment.unit."myproject-ear.ear".WeldStartService: Failed to start service
It seems like the switchyard runtime uses ear classloader to create a proxy of the Component Bean interface but the classloader cannot see the classes inside ear file.
I am using switchyard version 1.1.0 on EAP 6.1.1.
Please help me move forward. Any pointers will be much appreciated,
Thanks
Ajay