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

时间:2015-10-28 23:09:35

标签: maven tomcat

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

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

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

它的pom.xml在jar文件中指定了以下依赖项,其中找到了ServletContainer的超类:

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

当shipping-location-webapp运行配置tomcat:run goal执行时,它会读取web.xml,试图加载Servlet的ServletContainer实现并报告错误:

"ServletContainer cannot be cast to Servlet" 

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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