JBoss部署EAR内Vaadin应用出现ClassNotFoundException求助
问题
将Vaadin应用打包为WAR包并嵌入至EAR包中,部署在JBoss服务器上。访问该Vaadin应用时,页面加载过程中实例化Binder时抛出ClassNotFoundException,但所需类文件已存在于WAR包的WEB-INF/lib目录内。
异常日志
java.lang.TypeNotPresentException: Type com.vaadin.flow.component.Component not present at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:117) ~[?:?] at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:125) ~[?:?] at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49) ~[?:?] at sun.reflect.generics.visitor.Reifier.reifyTypeArguments(Reifier.java:68) ~[?:?] at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:138) ~[?:?] at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49) ~[?:?] at sun.reflect.generics.visitor.Reifier.reifyTypeArguments(Reifier.java:68) ~[?:?] at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:138) ~[?:?] at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49) ~[?:?] at sun.reflect.generics.repository.ConstructorRepository.computeParameterTypes(ConstructorRepository.java:111) ~[?:?] at sun.reflect.generics.repository.ConstructorRepository.getParameterTypes(ConstructorRepository.java:87) ~[?:?] at java.lang.reflect.Executable.getGenericParameterTypes(Executable.java:279) ~[?:?] at java.lang.reflect.Method.getGenericParameterTypes(Method.java:330) ~[?:?] at java.beans.FeatureDescriptor.getParameterTypes(FeatureDescriptor.java:391) ~[?:?] at java.beans.MethodDescriptor.setMethod(MethodDescriptor.java:118) ~[?:?] at java.beans.MethodDescriptor.<init>(MethodDescriptor.java:74) ~[?:?] at java.beans.MethodDescriptor.<init>(MethodDescriptor.java:58) ~[?:?] at java.beans.Introspector.getTargetMethodInfo(Introspector.java:1047) ~[?:?] at java.beans.Introspector.getBeanInfo(Introspector.java:462) ~[?:?] at java.beans.Introspector.getBeanInfo(Introspector.java:205) ~[?:?] at com.vaadin.flow.internal.BeanUtil.getBeanPropertyDescriptors(BeanUtil.java:83) ~[flow-server-2.7.15.jar:2.7.15] at com.vaadin.flow.data.binder.BeanPropertySet.<init>(BeanPropertySet.java:323) ~[flow-data-2.7.15.jar:2.7.15] at com.vaadin.flow.data.binder.BeanPropertySet.lambda$get$2(BeanPropertySet.java:439) ~[flow-data-2.7.15.jar:2.7.15] at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705) ~[?:?] at com.vaadin.flow.data.binder.BeanPropertySet.get(BeanPropertySet.java:438) ~[flow-data-2.7.15.jar:2.7.15] at com.vaadin.flow.data.binder.Binder.<init>(Binder.java:1547) ~[flow-data-2.7.15.jar:2.7.15] Caused by: java.lang.ClassNotFoundException: com.vaadin.flow.component.Component from [Module "deployment.xyz.ear" from Service Module Loader] at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:255) ~[?:?] at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:410) ~[?:?] at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398) ~[?:?] at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116) ~[?:?] at java.lang.Class.forName0(Native Method) ~[?:?] at java.lang.Class.forName(Class.java:398) ~[?:?] at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:114) ~[?:?] ... 120 more
解决方案
- 调整EAR类加载配置:JBoss默认的EAR类加载器无法直接访问WAR内部的依赖,需在
application.xml中为WAR模块配置独立类加载器,避免委托给EAR类加载器。示例配置:<module> <web> <web-uri>your-app.war</web-uri> <context-root>/your-app</context-root> </web> <class-loader delegate="false"/> </module> - 修正依赖范围:检查WAR的pom.xml,确保Vaadin相关依赖(如
flow-server、flow-data)的范围为compile,而非provided——provided会依赖容器提供该类,但JBoss不包含Vaadin类。 - 清理JBoss缓存:删除JBoss的
standalone/data/content和standalone/tmp目录下的缓存文件,避免旧类干扰,之后重新部署EAR包。 - 验证EAR结构:确认WAR包位于EAR根目录,而非EAR的
lib文件夹。若WAR被放入EAR/lib,会被EAR类加载器加载,导致依赖隔离问题。
内容的提问来源于stack exchange,提问作者Dinesh Kumar
相关产品推荐
相关产品推荐

