当我想启动 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.0 和 3.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.0和 jakarta.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 服务器。
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/