Eclipse 不可逆 Dynamic Web Module 4.0 选择; Tomcat 9 不支持

Posted

技术标签:

【中文标题】Eclipse 不可逆 Dynamic Web Module 4.0 选择; Tomcat 9 不支持【英文标题】:Eclipse irreversible Dynamic Web Module 4.0 selection; Tomcat 9 doesn't support it 【发布时间】:2018-07-16 20:55:17 【问题描述】:

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

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

然后我尝试添加 Tomcat 9 服务器。在此过程中,在“添加和删除”中,它会询问我要添加哪些项目以配置服务器。我选择了我的 Web 项目,但 Eclipse 说:“Tomcat 9.0 版仅支持 J2EE 1.2、1.3、1.4 和 Java EE 5、6、7 和 8 Web 模块”。

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

无法将项目构面动态 Web 模块的版本更改为 3.1。

嗯...所以我将其删除。我取消选中“动态 Web 模块”旁边的框,Eclipse 告诉我:

Dynamic Web Module 4.0 无法卸载。

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

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

【问题讨论】:

通常情况下,解锁、更改版本和重新锁定都可以使用 - 但这最终会起作用 eclipse or spring suit error maven project dynamic web module cannot be changed Re“当然,我在 Eclipse 中删除了 Tomcat 8.5 服务器和服务器运行时”...为什么需要这样做?两个 Tomcat 服务器都可以存在于 Eclipse 中(假设您已将它们安装到单独的目录中)。 @skomisa 这是一个新的系统安装,我什至没有安装 Tomcat 8.5 ——这就是我从 Eclipse 中删除该服务器和运行时的原因。 (我把我现有的项目带到了新机器上。) @GarretWilson 好的,知道了。 【参考方案1】:

我在与您相同的环境中重现了该问题。当我尝试从 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 9.0 版仅支持 J2EE 1.2、1.3、1.4 和 Java EE 5、6、7 和 8 Web 模块”。您的项目是否配置为使用 Servlet 4.0?对于我的 Maven 项目,我必须为 Servlet 4 发送 add this dependency to the POM。

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

【讨论】:

我的项目没有专门配置servlet版本。它使用javax.ws.rs-api:2.0.1resteasy-jaxrs:3.1.0.Final。这不适用于Tomcat 9吗?为什么我必须为 Servlet 4 添加依赖项?为什么我的项目需要使用 Servlet 4? 不,您的应用程序不需要 需要 Servlet 4 的依赖项,但是通过将 Dynamic Web Module 设置为 4.0 不是告诉 Eclipse 您的项目 在使用 Servlet 4.0 吗? (我怀疑我错过了您提出的观点。)无论如何,您的问题的答案是在 core.xml 中更正该版本。 明确地说,我没有收到您看到的错误“Tomcat 9.0 版仅支持...”,我想知道这是否是因为我更改了动态 Web 模块的 Web 应用程序到 4.0 确实使用的是 Servlet 4.0,而你的不是 - 仅此而已。 "...通过将 Dynamic Web Module 设置为 4.0,您不是告诉 Eclipse 您的项目使用的是 Servlet 4.0 吗?"不,通过将 Dynamic Web Module 设置为 4.0,我告诉 Eclipse 我想使用 Dynamic Web Module 4.0。我假设它比 Dynamic Web Module 3.1 更好,并且 支持 更高版本的 servlet API 但不需要它们,就像我假设 Tomcat 9 比 Tomcat 8 更好并且支持更高版本的 servlet API 但没有'不需要他们。也许我的假设是不正确的。 您手动编辑org.eclipse.wst.common.project.facet.core.xml 的解决方案有效!我会等着看是否有更多的“官方”方法可以直接做到这一点,如果没有,我会将您的答案标记为正确。谢谢。【参考方案2】:

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

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

希望对你有帮助

【讨论】:

【参考方案3】:

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

Dynamic Web Module 4.0 cannot be uninstalled.

1 - 所以;如果您无法卸载动态 Web 模块(我重复:“卸载”而不是“更改其版本”), 您可以先在项目目录中编辑该文件: .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"/>

或者您也可以在“项目构面配置”面板中更改它

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

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

希望对您有所帮助。

【讨论】:

【参考方案4】:

我将 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 项目并检查以反映更改。

【讨论】:

以上是关于Eclipse 不可逆 Dynamic Web Module 4.0 选择; Tomcat 9 不支持的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse如何导入dynamic web project?

Eclipse--Maven--Dynamic Web Module 3.0 requires Java 1.6 错误

eclipse报错Dynamic Web Module 3.0 requires Java 1.6

eclipse建web工程的dynamic web module version 是啥意思?

eclipse怎么导入dynamic web project

eclipse建web工程的dynamic web module version 具体是啥意思