无法定义类 jakarta.faces.webapp.FacesServlet

Meh*_*imi 2 jsf servlets wildfly jakarta-ee

当我想启动Wildfly服务器时出现以下错误:

09:26:10,548 警告 [org.jboss.modules.define](MSC 服务线程 1-1)无法在模块“deployment.demo-0.0.1-SNAPSHOT.war”中定义类 jakarta.faces.webapp.FacesServlet服务模块加载器:java.lang.NoClassDefFoundError:无法链接...

但在我更改后(在web.xml文件中):

<servlet-class>jakarta.faces.webapp.FacesServlet</servlet-class>
Run Code Online (Sandbox Code Playgroud)

<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
Run Code Online (Sandbox Code Playgroud)

错误消失了。

我已经尝试过jakarta.faces-api依赖项的4.0.03.0.0版本:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/jakarta.faces/jakarta.faces-api -->
        <dependency>
            <groupId>jakarta.faces</groupId>
            <artifactId>jakarta.faces-api</artifactId>
            <version>4.0.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.3.2</version>
            </plugin>
        </plugins>
    </build>
</project>
Run Code Online (Sandbox Code Playgroud)

这是我的 web.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
    version="5.0">

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>jakarta.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>

</web-app>
Run Code Online (Sandbox Code Playgroud)

基于jakarta.ee/specations/faces/3.0jakarta.ee/specations/faces/4.0我可以使用 jakarta.faces.webapp.FacesServlet 类,那么为什么我收到错误?

我正在使用最新的Eclipse (版本:2022-03 (4.23.0))wildfly-26.1.0.Final

Bal*_*usC 5

根据WildFly下载页面wildfly-26.1.0.Final不是Jakarta EE 9服务器,更不是Jakarta EE 10服务器。它是 Jakarta EE 8 服务器。

在此输入图像描述

Jakarta EE 8 又附带JSF 2.3(和Servlet 4.0)。这意味着您应该使用javax.faces.*包并且faces-config.xml应该符合 JSF 2.3 并且web.xml应该符合 Servlet 4.0。

您很可能打算选择wildfly-preview-26.1.0.Final上面部分提供的下载链接,特别标记为Preview。这是一个 Jakarta EE 9 服务器,它是第一个具有 Jakartified 包名称(即jakarta.*代替javax.*)的服务器,并附带JSF 3.0(和Servlet 5.0)。Jakarta EE 10 实施将由即将推出的 WildFly 27.x 提供,目前仍处于 Alpha 阶段。它将提供Faces 4.0(和Servlet 6.0)。

也就是说,pom.xml对于成熟的 Jakarta EE 服务器来说,您的说法是不正确的。您永远不应该手动将松散的 Jakarta EE 工件(例如 JSF)与 Web 应用程序一起发送。您应该将整个Jakarta EE 依赖项声明为providedWAR 中包含的物理 JAR 文件,而不是单个 JSF 依赖项。以下是 Jakarta EE 8 的情况:

<dependency>
    <groupId>jakarta.platform</groupId>
    <artifactId>jakarta.jakartaee-api</artifactId>
    <version>8.0.0</version>
    <scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

这确实是您所需要的pom.xml

也可以看看: