运行 由于未定义的组件类型,TOMEE-9.0 PLUS 上的一个简单的 JSF webapp 无法正常启动 jakarta.faces.ViewRoot

Running a simple JSF webapp on TOMEE-9.0 PLUS cannot start properly due to Undefined component type jakarta.faces.ViewRoot

希望TOMEE社区的人能看到。我不确定我是否更好地在 TOMEE Jira 项目中提交问题。我在 Linux 和 MAC 上在 PC 上测试了相同的场景,结果相同

简而言之,当运行使用 eclipse 和 TOMEE-9.0.0-M7 plus 部署此 webapp 后,我遇到了一个 JSF 应用程序错误。在启动期间一切看起来都很好,但是当在浏览器中到达应用程序上下文时我得到了错误(参见代码块)

Here 是 GitHub 包含我测试的项目的存储库

注意:我没有使用 maven 插件 运行 war,我在 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 命名空间。

请参阅相关文档 here,其中指出:

3.0.x The upcoming Jakarta Faces 3.0. It's equals to JSF 2.3 but with "jakarta.faces" packages and constants instead of "javax.faces"

我刚刚创建了 TOMEE-3754 并将更新依赖项,因此它将包含在下一个版本中。

长版

TomEE 9.0.0-M7 是通过字节码转换从与 TomEE 8 相同的代码库构建的。0.x 系列,即 JavaEE 命名空间。

目前,这两个版本都在 2.3.8 版本中捆绑了 MyFaces,它无法处理 Jakarta 命名空间。有必要升级到版本 3 中的 MyFaces。0.x。

要修复您的示例,您必须手动将 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>