jakarta-ee - 由于未定义的组件类型 jakarta.faces.ViewRoot,在 TOMEE-9.0 PLUS 上运行简单的 JSF webapp 无法正常启动
问题描述
我希望 TOMEE 社区的人能看到这一点。我不确定是否最好在 TOMEE Jira 项目中提交问题。我在 Linux 和 MAC 上的 PC 上测试了相同的场景,结果相同
简而言之,在运行 JSF 应用程序时,我在使用 eclipse 和 TOMEE-9.0.0-M7 plus部署了这个webapp后遇到了错误。启动期间一切看起来都很好,但是在浏览器中到达应用程序上下文时出现错误(请参阅代码块)
这是我测试的项目的 GitHub 存储库
注意:我没有使用 maven 插件来运行战争,我在 eclipse 中设置了 TOMEE。
谢谢。
这里是堆栈跟踪:
SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/samplejakarta9] threw exception [Undefined component type jakarta.faces.ViewRoot] with root cause
jakarta.faces.FacesException: Undefined component type jakarta.faces.ViewRoot
at org.apache.myfaces.application.ApplicationImpl.createComponent(ApplicationImpl.java:1504)
at org.apache.myfaces.application.ApplicationImpl.createComponent(ApplicationImpl.java:1472)
at jakarta.faces.application.ApplicationWrapper.createComponent(ApplicationWrapper.java:133)
at org.apache.myfaces.shared.view.ViewDeclarationLanguageBase.createView(ViewDeclarationLanguageBase.java:53)
at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.createView(FaceletViewDeclarationLanguage.java:2056)
at org.apache.myfaces.application.ViewHandlerImpl.createView(ViewHandlerImpl.java:264)
at jakarta.faces.application.ViewHandlerWrapper.createView(ViewHandlerWrapper.java:115)
at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage$FaceletViewMetadata.createMetadataView(FaceletViewDeclarationLanguage.java:2758)
at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:252)
at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:195)
at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:142)
at jakarta.faces.webapp.FacesServlet.service(FacesServlet.java:204)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
at org.apache.openejb.server.httpd.EEFilter.doFilter(EEFilter.java:67)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke(OpenEJBSecurityListener.java:97)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:353)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:870)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1696)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:834)
解决方案
tl;博士
9.0.0-M7 容器使用的是 MyFaces 版本 (2.3.8),它还没有准备好 Jakarta 命名空间。
请参阅此处的相关文档,其中指出:
3.0.x 即将到来的 Jakarta Faces 3.0。它等同于 JSF 2.3,但使用“jakarta.faces”包和常量而不是“javax.faces”
我刚刚创建了TOMEE-3754并将更新依赖项,因此它将包含在下一个版本中。
长版
TomEE 9.0.0-M7 是通过字节码转换从与 TomEE 8.0.x 系列相同的代码库构建的,这是 JavaEE 命名空间。
目前,两个版本都在 2.3.8 版本中捆绑了 MyFaces,无法处理 Jakarta 命名空间。有必要升级到 3.0.x 版本的 MyFaces。
要修复您的示例,您必须手动将 MyFaces 版本交换为 3.0.0。为此,只需删除
myfaces-api-2.3.8.jar
myfaces-impl-2.3.8.jar
在lib
容器的文件夹中。然后,您可以通过 3.0.0 版本替换它们
- https://mvnrepository.com/artifact/org.apache.myfaces.core/myfaces-api/3.0.0
- https://mvnrepository.com/artifact/org.apache.myfaces.core/myfaces-impl/3.0.0
您还可以通过 TomEE Maven 插件配置此行为。您的 POM 将类似于:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>${maven-war-plugin.version}</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomee.maven</groupId>
<artifactId>tomee-maven-plugin</artifactId>
<version>8.0.6</version> <!-- Note: No 9.0.0-M7 Maven Plugin is available yet but we can use the old one -->
<configuration>
<tomeeVersion>9.0.0-M7</tomeeVersion>
<tomeeClassifier>plus</tomeeClassifier>
<debug>false</debug>
<tomeeHttpPort>8282</tomeeHttpPort>
<debugPort>5005</debugPort>
<args>-Dfoo=bar</args>
<config>${project.basedir}/src/test/tomee/conf</config>
<libs>
<lib>remove:myfaces</lib>
<!-- Adding MyFaces 3.0.0 JSF implementation -->
<lib>org.apache.myfaces.core:myfaces-impl:3.0.0</lib>
<lib>org.apache.myfaces.core:myfaces-api:3.0.0</lib>
</libs>
<skipCurrentProject>true</skipCurrentProject>
<webapps>
<webapp>
com.github.gdiazs:sample-jakarta9:1.0.0-SNAPSHOT
</webapp>
</webapps>
</configuration>
</plugin>
</plugins>
</build>
推荐阅读
- python-3.x - IllegalArgumentException:'不支持的类文件主要版本 56'
- tcp - 攻击者会在wireshark 中搜索什么二进制值来检测TCP 段?
- python - Django 表单不发送 POST 请求并且站点冻结
- android - OK Google 无法使用 Google 操作。我的应用无法识别
- swift - 使用 SPM(Swift 包管理器)获取本地文件的 URL
- dynamics-crm - 门户中设置的多选选项,或可行的替代方案
- javascript - 将元素设置为画布中所有图层的顶部
- html - :first-child 选择所有元素
- javascript - 如何在 javascript 中从 varibale 中用逗号分隔
- java - 使用 PhpJasper 创建报告时 JDK 版本出错