JoinFaces 5.4.4+Primefaces 15启动报错:缺失PreRenderComponentEvent类
问题:Spring Boot + Primefaces启动时出现ClassNotFoundException: javax.faces.event.PreRenderComponentEvent
离开Primefaces与JoinFaces数年后,我尝试使用最新版Spring Boot搭配Primefaces搭建Web应用。项目构建无报错,但启动时出现如下堆栈错误:
2025-04-12T19:39:47.793-04:00 INFO 253619 --- [ restartedMain] j.e.r.webcontainer.faces.application : JSF1048: PostConstruct/PreDestroy annotations present. ManagedBeans methods marked with these annotations will have said annotations processed. jakarta.faces.FacesException: javax.faces.event.PreRenderComponentEvent at com.sun.faces.config.processor.AbstractConfigProcessor.loadClass(AbstractConfigProcessor.java:289) at com.sun.faces.config.processor.ApplicationConfigProcessor.addSystemEventListener(ApplicationConfigProcessor.java:755) at com.sun.faces.config.processor.ApplicationConfigProcessor.process(ApplicationConfigProcessor.java:277) at com.sun.faces.config.ConfigManager.lambda$initialize$0(ConfigManager.java:265) at java.base/java.util.AbstractList$RandomAccessSpliterator.forEachRemaining(AbstractList.java:722) at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762) at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:263) at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:185) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4047) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4477) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1203) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1193) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:749) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:772) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1203) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1193) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:749) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:203) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:415) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:870) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.startup.Tomcat.start(Tomcat.java:437) at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:128) at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:107) at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:517) at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:219) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:193) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:167) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:621) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350) at org.joinfaces.example.JarExampleApplication.main(JarExampleApplication.java:16) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50) Caused by: java.lang.ClassNotFoundException: javax.faces.event.PreRenderComponentEvent at org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader.loadClass(TomcatEmbeddedWebappClassLoader.java:72) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1187) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:534) at java.base/java.lang.Class.forName(Class.java:513) at com.sun.faces.util.Util.loadClass(Util.java:372) at com.sun.faces.config.processor.AbstractConfigProcessor.loadClass(AbstractConfigProcessor.java:282)
我尝试过多种版本组合,但仍出现相同错误,说明存在根本性问题。恳请提供建议或解决方案!
我的build.gradle配置如下:
plugins { id "java" id 'org.springframework.boot' version '3.4.4' id 'application' } java { toolchain { languageVersion = JavaLanguageVersion.of(21) } } repositories { mavenCentral() } dependencies { // joinfaces implementation platform('org.joinfaces:joinfaces-platform:5.4.4') implementation 'org.joinfaces:primefaces-spring-boot-starter:5.4.4' implementation ('org.joinfaces:faces-spring-boot-starter:5.4.4') // primefaces implementation 'org.primefaces:primefaces:15.0.3' implementation 'org.primefaces.extensions:primefaces-extensions:15.0.3' // jakarta EE implementation 'jakarta.platform:jakarta.jakartaee-web-api:10.0.0' implementation 'jakarta.servlet:jakarta.servlet-api:6.0.0' implementation 'jakarta.faces:jakarta.faces-api:4.0.0' implementation 'org.glassfish:jakarta.faces:4.0.0' // spring boot implementation("org.springframework.boot:spring-boot-starter-web:3.4.4") implementation("org.springframework.boot:spring-boot-starter-validation:3.4.4") implementation("org.springframework.boot:spring-boot-devtools:3.4.4") testImplementation "org.springframework.boot:spring-boot-starter-test:3.4.4" // lombok implementation 'org.projectlombok:lombok:1.18.38' } tasks.named('test') { useJUnitPlatform() }
解决方案
1. 核心问题定位
错误中的javax.faces.event.PreRenderComponentEvent是Java EE时代的旧包名,Jakarta EE 10(对应Spring Boot 3.x)已经将所有API迁移到jakarta.*包下。出现这个错误是因为依赖冲突,手动引入的重复依赖导致系统加载了旧的API路径。
2. 精简依赖配置
JoinFaces的Starter已经自动管理Primefaces、JSF实现(Mojarra)等依赖,不需要手动重复引入Jakarta EE API或JSF实现。修改dependencies部分如下:
dependencies { // JoinFaces 自动管理所有JSF/Primefaces依赖 implementation platform('org.joinfaces:joinfaces-platform:5.4.4') implementation 'org.joinfaces:primefaces-spring-boot-starter:5.4.4' // Spring Boot 核心依赖 implementation("org.springframework.boot:spring-boot-starter-web:3.4.4") implementation("org.springframework.boot:spring-boot-starter-validation:3.4.4") implementation("org.springframework.boot:spring-boot-devtools:3.4.4") testImplementation "org.springframework.boot:spring-boot-starter-test:3.4.4" // Lombok implementation 'org.projectlombok:lombok:1.18.38' }
3. 验证依赖一致性
运行以下命令检查依赖树,确保没有javax.*开头的JSF相关依赖:
./gradlew dependencies
4. 清理缓存并重新构建
执行以下命令清理旧缓存,避免残留的冲突依赖:
./gradlew clean build --refresh-dependencies
完成以上步骤后重新启动项目,即可解决ClassNotFoundException问题。
内容的提问来源于stack exchange,提问作者Edward Kennedy
相关产品推荐
相关产品推荐

