We have been using JBoss 6 for some time, and we are now moving to JBoss 7. (To
be more precise, we are using Red Hat Enterprise Application Server 6, which we
understand corresponds to JBoss 7.)
Several of our tapestry applications are working well on JBoss 7. In fact, they
all work well if we put all dependencies into WEB-INF/lib. However, we'd like
to define modules and avoid duplicating so much in the WEB-INF/lib location of
multiple WARs. When we try this, we occasionally see a stack trace like the one
pasted below.
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException:
stanford.pg.directory.model.Entity from [Module "stanford.tapestry5:main" from
local module loader @2c9b42e6 (finder: local module finder @54520eb (roots:
D:\pgnet\eap\modules,D:\pgnet\eap\modules\system\layers\base))]
at
org.apache.tapestry5.internal.plastic.asm.ClassWriter.getCommonSuperClass(ClassWriter.java:1296)
[plastic-5.3.2.jar:]
at
org.apache.tapestry5.internal.plastic.asm.ClassWriter.getMergedType(ClassWriter.java:1268)
[plastic-5.3.2.jar:]
at org.apache.tapestry5.internal.plastic.asm.Frame.merge(Frame.java:1400)
[plastic-5.3.2.jar:]
at org.apache.tapestry5.internal.plastic.asm.Frame.merge(Frame.java:1302)
[plastic-5.3.2.jar:]
at
org.apache.tapestry5.internal.plastic.asm.MethodWriter.visitMaxs(MethodWriter.java:1282)
[plastic-5.3.2.jar:]
at
org.apache.tapestry5.internal.plastic.asm.tree.MethodNode.accept(MethodNode.java:487)
[plastic-5.3.2.jar:]
at
org.apache.tapestry5.internal.plastic.asm.tree.MethodNode.accept(MethodNode.java:412)
[plastic-5.3.2.jar:]
at
org.apache.tapestry5.internal.plastic.asm.tree.ClassNode.accept(ClassNode.java:275)
[plastic-5.3.2.jar:]
at
org.apache.tapestry5.internal.plastic.PlasticClassPool.toBytecode(PlasticClassPool.java:187)
[plastic-5.3.2.jar:]
at
org.apache.tapestry5.internal.plastic.PlasticClassPool.realize(PlasticClassPool.java:140)
[plastic-5.3.2.jar:]
at
org.apache.tapestry5.internal.plastic.PlasticClassPool.realizeTransformedClass(PlasticClassPool.java:122)
[plastic-5.3.2.jar:]
at
org.apache.tapestry5.internal.plastic.PlasticClassImpl.createInstantiator(PlasticClassImpl.java:356)
[plastic-5.3.2.jar:]
at
org.apache.tapestry5.internal.plastic.PlasticClassPool.loadAndTransformClass(PlasticClassPool.java:350)
[plastic-5.3.2.jar:]
at
org.apache.tapestry5.internal.plastic.PlasticClassLoader.loadClass(PlasticClassLoader.java:38)
[plastic-5.3.2.jar:]
at java.lang.ClassLoader.loadClass(ClassLoader.java:247) [rt.jar:1.6.0_31]
at
org.apache.tapestry5.internal.plastic.PlasticClassPool.getClassInstantiator(PlasticClassPool.java:510)
[plastic-5.3.2.jar:]
at
org.apache.tapestry5.plastic.PlasticManager.getClassInstantiator(PlasticManager.java:189)
[plastic-5.3.2.jar:]
at
org.apache.tapestry5.internal.services.ComponentInstantiatorSourceImpl$2.invoke(ComponentInstantiatorSourceImpl.java:234)
[tapestry-core-5.3.2.jar:]
at
org.apache.tapestry5.internal.services.ComponentInstantiatorSourceImpl$2.invoke(ComponentInstantiatorSourceImpl.java:228)
[tapestry-core-5.3.2.jar:]
at
org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74)
[tapestry-ioc-5.3.2.jar:]
... 66 more
---------
Pasted below is a sample page class which has this problem
---------
public class Manage extends TesterBase {
@Property
private String greeting;
protected boolean setupRender() {
try {
Entity userInfo = getUserInfo();
if (userInfo==null) {
greeting="no greeting";
} else {
greeting="Greetings " + userInfo.getIdNumber();
}
setRenderFlag(true);
} catch (Exception e) {
System.err.println("Demo threw exception");
e.printStackTrace();
}
return true;
}
}
----------
If we modify this class slightly, we do NOT see the problem any longer. Here is
the modified version.
----------
public class Manage extends TesterBase {
private Entity userInfo;
@Property
private String greeting;
protected boolean setupRender() {
try {
userInfo = getUserInfo();
if (userInfo==null) {
greeting="no greeting";
} else {
greeting="Greetings " + userInfo.getIdNumber();
}
setRenderFlag(true);
} catch (Exception e) {
System.err.println("Demo threw exception");
e.printStackTrace();
}
return true;
}
}
Reference material about modular class loading system used in EAP
https://access.redhat.com/documentation/en-US/JBoss_Enterprise_Application_Platform/6.3/html/Development_Guide/sect-About_Modules_and_the_New_Modular_Class_Loading_System_used_in_JBoss_EAP_6.html
Thank you for any help, insights or hints.
Kristen Murray
[email protected]