gpt4 book ai didi

maven - 当运行 eclipse 运行配置时执行 maven tomcat :run goal, Tomcat 会在哪里加载 jar?

转载 作者:行者123 更新时间:2023-11-28 23:28:54 25 4
gpt4 key购买 nike

我收到错误“ServletContainer cannot be cast to Servlet”并且无法理解为什么,尽管在 stackoverflow 中阅读了相关答案。

我的 shipment-location-webapp web.xml 指定:

<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

它的 pom.xml 指定了对 jar 文件的以下依赖关系,其中找到了 ServletContainer 的父类(super class):

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</dependency>

shipment-location-webapp运行配置tomcat:run目标执行时,读取web.xml,尝试加载Servlet的ServletContainer实现,报错:

"ServletContainer cannot be cast to Servlet" 

这很奇怪,因为当我们将 Tomcat 作为 eclipse“服务器”运行时,不会出现这样的错误。它在 Tomcat 库或 shipment-location-webapp WEB-INF/lib 中找到 servlet-api jar 文件(它可以在两个地方找到)。

通过在 pom 中将此 jar 的范围设置为“提供”来解决问题:

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

作为服务器运行 Tomcat 仍然有效是有道理的,因为这个 jar 文件仍然在 Tomcat 库中“提供”,但是为什么这解决了运行配置 tomcat:run 目标的问题???如果它在 Tomcat 库中找到该文件,它应该可以在不更改范围的情况下工作。事实上,我们可以从 Tomcat 库中删除 servlet-api,它仍然有效!!!它不再由容器“提供”,而是由其他一些“提供者”“提供”。

事实证明,tomcat:run 插件会在我的本地 maven 存储库中打开 servlet-api-2.5.jar(“已提供”或未提供)。如果我浏览我的 .m2/repository/javax/servlet/servlet-api/2.5 目录并删除 jar,执行 tomcat:run 会恢复它,然后你不能删除它,因为它当前是打开的。但是即使知道 tomcat:run 在哪里找到这个 jar 也不能解释为什么当这个依赖项没有在 pom 中声明为“已提供”时它会生成“ServletContainer 无法转换为 Servlet”错误。

所以我现在实际上有两个问题: 1)这个 tomcat:run 目标在哪里寻找 jar ? 2) “提供的”作用域是否真的会导致它将 jar 提取到我的本地存储库而不是期望它被提供?

最佳答案

需要 Jersey-server 依赖项,将其添加到您的 pom.xml 并尝试部署。

<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.11</version>
</dependency>

关于maven - 当运行 eclipse 运行配置时执行 maven tomcat :run goal, Tomcat 会在哪里加载 jar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33403178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com