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

标签 jsf servlets jakarta-ee wildfly

当我想启动 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>

错误消失了。

我已经尝试过 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>

这是我的 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.0jakarta.ee/specifications/faces/4.0我可以使用 jakarta.faces.webapp.FacesServlet 类,那么为什么我收到错误?

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

最佳答案

根据WildFly download page , wildfly-26.1.0.Final 不是 Jakarta EE 9 服务器,更不用说 Jakarta EE 10 服务器了。它是 Jakarta EE 8 服务器。

enter image description here

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下载链接,由其上面的部分提供,特别标记为预览。这是一个 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 依赖项声明为provided,而不是将单个JSF 依赖项声明为包含在WAR 中的物理JAR 文件。以下是 Jakarta EE 8 的情况:

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

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

另请参阅:

关于jsf - 无法定义类 jakarta.faces.webapp.FacesServlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72456700/

相关文章:

jsf - 将 JSF 复合组件打包到 JAR 中

authentication - 如何在 Tomcat 5.5.x 中向经过身份验证的用户授予访问权限?

spring - org.springframework.beans.factory.BeanCreationException 创建 ServletContext 中定义的名称为 'sessionFactory' 的 bean 时出错

java - 在 Java 中使用 multipart/form-data 获取 HTTP POST 请求中的数据(Spring)

java - 日期的 hibernate 条件

java - 在运行时获取有关实体的 hibernate 信息

java - 嵌套 forEach 的 JSF JSTL 问题

java - JSF 1.2 startElement 和 writeAttribute 解释

java - Primefaces 微调器不接受来自小键盘的输入

java - Servlet 在访问网络驱动器时抛出文件未找到 excp