首页 > 解决方案 > 由于未定义的组件类型 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)    

标签: jakarta-eeapache-tomee

解决方案


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 版本替换它们

您还可以通过 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>

推荐阅读