[EAR deployment] War classes cannot see EJB classes
guinotphil Jul 18, 2011 3:50 AMHello,
I've been starting playing with JBoss AS 7.0 for the past the weeks and it's very exciting and interesting.
I'm now familiar with the modules and dependencies.
Now, I'm trying to deploy an EAR application with a WAR module and an EJB module.
The problem is that I get a java.lang.NoClassDefFoundError caused by: java.lang.ClassNotFoundException when a class from the WAR module need a class from the EJB module.
MyTest.EAR:
EarContent
|
|---- lib (seam 2.2 libraries)
| |---- hibernate-annotations.jar
| |---- hibernate-commons-annotations.jar
| |---- hibernate-core.jar
| |---- hibernate-entitymanager.jar
| |---- hibernate-search.jar
| |---- hibernate-validator.jar
| |---- jboss-el.jar
jboss-seam
| |---- .jar
|---- META-INF
| |---- application.xml
jboss-deployment-structure.xml (descriped at the end of message)
| |----
All jars come from Seam 2.2 as I need to deploy a seam 2.2 application...
The application.xml
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:application="http://java.sun.com/xml/ns/javaee/application_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" id="Application_ID" version="6">
<display-name>MyTest.EAR</display-name>
<module>
<ejb>MyTest.EJB.jar</ejb>
</module>
<module>
<web>
<web-uri>MyTest.WAR.war</web-uri>
<context-root>/test</context-root>
</web>
</module>
</application>
The EJB project is very simple, it got only one class: MyClass.java
public class TestClass
{
public static void helloWorld() {
System.out.println("Hello World");
}
}
And here is the content of the WAR project:
MyTest.WAR
WebContent
|
|---- META-INF
(descriped at the end of message)
| |---- MANIFEST.MF |---- WEB-INF
| |---- lib/ (empty directory)
web.xml
| |----
|---- test.page.xml
|
src
|
|----seam.properties (empty file)
|----src/test
| |----
SeamClass.java
web.xml defines the standard servlet mapping:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>MyTest.WAR</display-name>
<listener>
<listener-class>
org.jboss.seam.servlet.SeamListener
</listener-class>
</listener>
<filter>
<filter-name>Seam Filter</filter-name>
<filter-class>org.jboss.seam.web.SeamFilter</filter-class>
<init-param>
<param-name>createTempFiles</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Seam Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
</web-app>
test.page.xml just call a method from SeamClass :
<?xml version="1.0" encoding="UTF-8"?>
<page xmlns="http://jboss.com/products/seam/pages"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.1.xsd">
<begin-conversation join="true" />
<action execute="#{seamClass.helloWorld()}" />
</page>
And here is SeamClass:
package test;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Name;
@Name("seamClass")
@Scope(ScopeType.CONVERSATION)
public class SeamClass
{
public void helloWorld() {
System.out.println("Entering....");
MyClass.helloWorld();
}
}
After deploy, when I call http://localhost:8080/test/test.jsf, I get the following output:
11:21:53,023 INFO [stdout] (http--127.0.0.1-8080-1) Entering...
11:21:53,023 GRAVE [org.jboss.seam.jsf.SeamPhaseListener] (http--127.0.0.1-8080-1) swallowing exception: javax.el.ELException: java.lang.reflect.InvocationTargetException
at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:339) [jboss-el.jar:]
at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:280) [jboss-el.jar:]
at org.jboss.el.parser.AstMethodSuffix.getValue(AstMethodSuffix.java:59) [jboss-el.jar:]
at org.jboss.el.parser.AstMethodSuffix.invoke(AstMethodSuffix.java:65) [jboss-el.jar:]
at org.jboss.el.parser.AstValue.invoke(AstValue.java:96) [jboss-el.jar:]
at org.jboss.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276) [jboss-el.jar:]
at org.jboss.seam.core.Expressions$2.invoke(Expressions.java:221) [jboss-seam.jar:]
at org.jboss.seam.navigation.Page.preRender(Page.java:311) [jboss-seam.jar:]
at org.jboss.seam.navigation.Pages.preRender(Pages.java:351) [jboss-seam.jar:]
at org.jboss.seam.jsf.SeamPhaseListener.preRenderPage(SeamPhaseListener.java:560) [jboss-seam.jar:]
at org.jboss.seam.jsf.SeamPhaseListener.beforeRenderResponse(SeamPhaseListener.java:471) [jboss-seam.jar:]
at org.jboss.seam.jsf.SeamPhaseListener.beforeServletPhase(SeamPhaseListener.java:147) [jboss-seam.jar:]
at org.jboss.seam.jsf.SeamPhaseListener.beforePhase(SeamPhaseListener.java:117) [jboss-seam.jar:]
at com.sun.faces.lifecycle.Phase.handleBeforePhase(Phase.java:214) [jsf-impl-1.2_13.jar:1.2_13-b01-FCS]
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:96) [jsf-impl-1.2_13.jar:1.2_13-b01-FCS]
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) [jsf-impl-1.2_13.jar:1.2_13-b01-FCS]
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:266) [jsf-api-1.2_13.jar:1.2_13-b01-FCS]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.0.CR4.jar:7.1.0.Alpha1-SNAPSHOT]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.0.CR4.jar:7.1.0.Alpha1-SNAPSHOT]
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83) [jboss-seam.jar:]
at org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40) [jboss-seam.jar:]
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) [jboss-seam.jar:]
at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90) [jboss-seam.jar:]
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) [jboss-seam.jar:]
at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64) [jboss-seam.jar:]
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) [jboss-seam.jar:]
at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45) [jboss-seam.jar:]
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) [jboss-seam.jar:]
at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158) [jboss-seam.jar:]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.0.CR4.jar:7.1.0.Alpha1-SNAPSHOT]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.0.CR4.jar:7.1.0.Alpha1-SNAPSHOT]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.0.CR4.jar:7.1.0.Alpha1-SNAPSHOT]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.0.CR4.jar:7.1.0.Alpha1-SNAPSHOT]
at org.jboss.as.web.NamingValve.invoke(NamingValve.java:57) [jboss-as-web-7.1.0.Alpha1-SNAPSHOT.jar:7.1.0.Alpha1-SNAPSHOT]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:154) [jbossweb-7.0.0.CR4.jar:7.1.0.Alpha1-SNAPSHOT]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.0.CR4.jar:7.1.0.Alpha1-SNAPSHOT]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.0.CR4.jar:7.1.0.Alpha1-SNAPSHOT]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [jbossweb-7.0.0.CR4.jar:7.1.0.Alpha1-SNAPSHOT]
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.0.CR4.jar:7.1.0.Alpha1-SNAPSHOT]
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:667) [jbossweb-7.0.0.CR4.jar:7.1.0.Alpha1-SNAPSHOT]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:952) [jbossweb-7.0.0.CR4.jar:7.1.0.Alpha1-SNAPSHOT]
at java.lang.Thread.run(Thread.java:662) [:1.6.0_22]
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_22]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [:1.6.0_22]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [:1.6.0_22]
at java.lang.reflect.Method.invoke(Method.java:597) [:1.6.0_22]
at org.jboss.seam.util.Reflections.invoke(Reflections.java:22) [jboss-seam.jar:]
at org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:32) [jboss-seam.jar:]
at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56) [jboss-seam.jar:]
at org.jboss.seam.transaction.RollbackInterceptor.aroundInvoke(RollbackInterceptor.java:28) [jboss-seam.jar:]
at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) [jboss-seam.jar:]
at org.jboss.seam.core.MethodContextInterceptor.aroundInvoke(MethodContextInterceptor.java:44) [jboss-seam.jar:]
at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) [jboss-seam.jar:]
at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:107) [jboss-seam.jar:]
at org.jboss.seam.intercept.JavaBeanInterceptor.interceptInvocation(JavaBeanInterceptor.java:185) [jboss-seam.jar:]
at org.jboss.seam.intercept.JavaBeanInterceptor.invoke(JavaBeanInterceptor.java:103) [jboss-seam.jar:]
at test.SeamClass_$$_javassist_seam_2.helloWorld(SeamClass_$$_javassist_seam_2.java) [classes:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_22]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [:1.6.0_22]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [:1.6.0_22]
at java.lang.reflect.Method.invoke(Method.java:597) [:1.6.0_22]
at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:335) [jboss-el.jar:]
... 41 more
Caused by: java.lang.NoClassDefFoundError: test/TestClass
at test.SeamClass.helloWorld(SeamClass.java:13) [classes:]
... 61 more
Caused by: java.lang.ClassNotFoundException: test.TestClass from [Module "deployment.MyTest.EAR.ear.MyTest.WAR.war:main" from Service Module Loader]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:358)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:330)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:307)
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:101)
... 62 more
It entered into the seam component method, but cannot find the class in the EJB module.
I've tried to deploy the EAR with those settings:
jboss-deployment-structure.xml
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<ear-subdeployments-isolated>false</ear-subdeployments-isolated>
<deployment>
<!-- seam dependencies -->
<exclusions>
<module name="com.sun.jsf-impl" />
<module name="javax.faces.api" />
</exclusions>
<dependencies>
<module name="org.javassist" export="true" />
<module name="org.dom4j" export="true" />
<module name="com.sun.jsf-impl" slot="1.2" export="true" />
<module name="javax.faces.api" slot="1.2" export="true" />
<module name="org.slf4j" export="true" />
<module name="org.apache.commons.logging" export="true" />
</dependencies>
</deployment>
<sub-deployment name="MyTest.EJB.jar">
</sub-deployment>
<sub-deployment name="MyTest.WAR.war">
<!-- seam / jsf 1.2 dependencies -->
<exclusions>
<module name="com.sun.jsf-impl" />
<module name="javax.faces.api" />
</exclusions>
<dependencies>
<module name="com.sun.jsf-impl" slot="1.2" />
<module name="javax.faces.api" slot="1.2" />
<module name="deployment.MyTest.EAR.ear.MyTest.EJB.jar" />
</dependencies>
</sub-deployment>
</jboss-deployment-structure>
As you can see I disabled the subdeployments isolation and set up a dependency from the WAR module to the EJB module. I also put the following dependency in the War module's MANIFEST.MF:
Manifest-Version: 1.0
Class-Path:
Dependencies: deployment.MyTest.EAR.ear.MyTest.EJB.jar
But I still can't make subdeployment isolation being disabled and the war module cannot see the ejb module.
What am I doing wrong ? Any kind of help will be welcome.
Thank you !