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

Failed to define class jakarta.faces.webapp.FacesServlet

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

09:26:10,548 WARN [org.jboss.modules.define] (MSC service thread 1-1) Failed to define class jakarta.faces.webapp.FacesServlet in Module "deployment.demo-0.0.1-SNAPSHOT.war" from Service Module Loader: java.lang.NoClassDefFoundError: Failed to link...

但是在我改变之后(在web.xml文件中):

<servlet-class>jakarta.faces.webapp.FacesServlet</servlet-class>

<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>

错误消失了。

我已经在 4.0.03.0.0 版本 jakarta.faces 上都试过了]-api依赖:

<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>

这是我的 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>

基于jakarta.ee/specifications/faces/3.0 and jakarta.ee/specifications/faces/4.0我可以使用jakarta.faces.webapp.FacesServlet class,为什么我会收到错误?

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

根据 WildFly download pagewildfly-26.1.0.Final 不是 Jakarta EE 9 服务器,更不用说 Jakarta EE 10 服务器了。这是一个 Jakarta EE 8 服务器。

Jakarta EE 8 随附 JSF 2.3(和 Servlet 4.0)。然后您应该遵循 JSF 2.3 specification (and Servlet 4.0 specification).

这意味着您应该使用 javax.faces.* 包,faces-config.xml 应该符合 JSF 2.3,web.xml 应该符合 Servlet 4.0。

您很可能打算选择上面部分提供的 wildfly-preview-26.1.0.Final 下载 link。这是一个 Jakarta EE 9 服务器,它是第一个具有 Jakartified 包名称(即 jakarta.* 而不是 javax.*)的服务器,并随附 JSF 3.0 和 Servlet 5.0。

也就是说,您的 pom.xml 对于成熟的 Jakarta EE 服务器来说是不正确的。您永远不应该将松散的 Jakarta EE 工件(例如 JSF)与 Web 应用程序一起手动发送。您应该声明整个 provided Jakarta EE 依赖项,而不是单独的 JSF 依赖项。下面一个是 Jakarta EE 8:

<dependency>
    <groupId>jakarta.platform</groupId>
    <artifactId>jakarta.jakartaee-api</artifactId>
    <version>8.0.0</version>
    <scope>provided</scope>
</dependency>

这就是您在 pom.xml 中真正需要的全部。

另请参阅: