Eclipse不可逆Dynamic Web Module 4.0选择; Tomcat9个不支持

Eclipse irreversible Dynamic Web Module 4.0 selection; Tomcat 9 doesn't support it

我在 Windows 10 和 Java 8 上使用 Eclipse Oxygen.2 (4.7.2)。我在 Eclipse 中 运行 使用 [=34] 有一个分面项目=].我一直在使用 Tomcat 8.5,但在新系统上我升级到 Tomcat 9。当然我删除了 Eclipse 中的 Tomcat 8.5 服务器和服务器 运行time,并且添加回 Tomcat 9 服务器 运行 时间。

在 Eclipse 中添加 Tomcat 9 服务器之前,我验证了项目的 Project Facets。我看到动态 Web 模块设置为“3.1”,但现在“4.0”可用。我更改为“4.0”,认为这可以让我访问更新的 API。

然后我尝试添加 Tomcat 9 服务器。在此过程中,在 "Add and Remove" 它询问我要添加哪些项目以配置服务器。我选择了我的 web 项目,但 Eclipse 说:"Tomcat version 9.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5, 6, 7, and 8 Web modules".

据我所知,这正是我正在使用的。但我唯一改变的是动态网络模块。所以我回到我的项目配置并尝试将 "Dynamic Web Module" 改回“3.1”。 Eclipse 告诉我:

Cannot change version of project facet Dynamic Web Module to 3.1.

嗯……所以我就把它删掉。我取消选中 "Dynamic Web Module" 旁边的框,Eclipse 告诉我:

Dynamic Web Module 4.0 cannot be uninstalled.

好吧,那是一壶好鱼。我无法将我的项目部署到 Tomcat,显然是因为动态 Web 模块。我无法将动态 Web 模块改回原来的样子。我该怎么办?问题出在哪里?

我打开了 Eclipse Bug 530844 看看我是否能找到这种行为的一些原因。

我在和你一样的环境下重现了这个问题。当我试图从 4.0 回归到 3.1 时,出现以下错误:

This blog provided the solution(有点乱,但它有效):

  • 在项目的 .settings 目录中编辑文件 org.eclipse.wst.common.project.facet.core.xml
  • 对于包含 facet="jst.web" version="4.0" 的行,将版本更改为 3.1.

另见这个 SO 问题:Dynamic Web Module 3.0 -- 3.1


几个相关问题:

  • 看起来您的设置可能不太正确导致该错误 "Tomcat version 9.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5, 6, 7, and 8 Web modules"。您的项目是否配置为使用 Servlet 4.0?对于我的 Maven 项目,我必须 add this dependency to the POM for Servlet 4.

  • 即使将动态 Web 模块版本更改为 3.1,我的 Web 应用程序仍继续使用 4.0 版,所以我不确定该方面实现了什么。

我的解决方案是回复此消息:

Dynamic Web Module 4.0 cannot be uninstalled.

1 - 所以;如果您无法卸载动态 Web 模块(我重复:"Uninstall" 而不是 "change its version"), 您可以先在项目目录中编辑文件: .settings/org.eclipse.wst.common.project.facet.core.xml 并通过删除此行手动卸载它:

<installed facet="jst.web" version="4.0"/>

2 - 在此之后,如果你想使用动态 web 模块 4.0,请确保你至少在同一个文件中的方面 java 1.8 .settings/org.eclipse.wst.common.project.facet.core.xml

<installed facet="java" version="1.8"/>

或者您也可以在 "project Facets configuration" 面板中进行更改

3 - 如果问题仍然存在,请查看您的 pom 文件并确认没有强制 java 版本为 1.7,您应该具有这些属性

    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>

如果您更改了 pom 文件,请记得更新您的项目:Maven > 更新项目

4 - 最后,如果您仍然不能使用 Dynamic Web Module 4.0,只需选择删除您的 WEB-INF\web.xml 文件,该文件可以具有另一个动态 Web 版本的配置,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
...

否则您可以手动更改支持的版本:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
...

return 到 Project Facets 配置面板,再次尝试选择 Dynamic Web Module 4.0,它应该可以工作

希望对您有所帮助。

对我来说,从我的 pom 文件中删除下面的依赖项后,这个问题就消失了。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.0</version>
    <scope>provided</scope>
</dependency>

希望对您有所帮助

我将 javax.servlet-api 降级为 3.1.0 ;

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

然后根据@Skomisa 的上述评论进行编辑;

编辑文件 org.eclipse.wst.common.project.facet.core.xml 项目的 .settings 目录。 对于包含 facet="jst.web" version="4.0" 的行,将版本更改为 3.1.

注意 - 更新 Maven 项目并检查以反映更改。