ClassNotFoundException:ContextLoaderListener,当使用带有 maven tomcat8 插件和 PostResources 的 Intellij 时

ClassNotFoundException: ContextLoaderListener, when using Intellij with maven tomcat8 plugin and PostResources

我正在使用带有 Maven tomcat8 插件的 Intellij。我在我的上下文文件中添加了一个 PostResource:

    <Resources className="org.apache.catalina.webresources.StandardRoot">
     <PostResources base="{my_post_resources_path}}"
      className="org.apache.catalina.webresources.JarResourceSet"
      internalPath="/post-resources"
      webAppMount="/WEB-INF/classes/post-resources"/>
    </Resources>

正在取货,没问题。当我从命令行执行 mvn tomcat8:run 时,它工作得很好。但是当我从 Intellij 中 运行 它时,从 Maven 侧边栏中,通过右键单击 tomcat8 插件,然后 tomcat8:run,我得到这个错误:

    SEVERE: Error configuring application listener of class 
    org.springframework.web.context.ContextLoaderListener
    java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

    SEVERE: Error configuring application listener of class 
    org.springframework.web.context.request.RequestContextListener
    java.lang.ClassNotFoundException: org.springframework.web.context.request.RequestContextListener

我意识到这两个 类 都可以在 spring-web 中找到,我在我的 pom 中将其作为依赖项:

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>4.3.26.RELEASE</version>
    </dependency>

我已经确认在我的项目的 target/war/WEB-INF/lib 目录中,spring-web jar 就在那里。我已经看到很多 post 关于通过手动将 jars 添加到部署中来使它与 Eclipse 一起工作。我已经看到你可以在 Intellij 中做类似的事情,在文件 -> 项目结构 -> 工件中,但是看不到在哪里添加依赖项,而且我认为这无论如何都行不通。有人在 post 上说要添加 spring-context-support 作为依赖项,我做到了。结果相同。

我已经关闭并回复了 Intellij 很多次,运行 并重新运行 mvn clean install ...没有任何东西可以使 tomcat 从 Intellij 中正常启动。有什么想法吗?

更新:我发现从命令行 运行ning 时也会发生这种情况,所以这不是 Intellij 的事情。这似乎与我使用 web.xml 而不是 Java 配置有关。我的理解是应该与 web.xml.

一起使用

在我的web.xml中我定义了:

    <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <listener>
      <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>

如果我将它们注释掉,错误就会消失。但是当然,应用程序不会启动,因为没有 ContextLoaderListener。 :(

问题出在 tomcat8-maven-plugin 的配置上,我缺少 warSourceDirectory。

    <configuration>
      <port>8080</port>
      <path>/myapp</path>
      <addContextWarDependencies>true</addContextWarDependencies>
      <contextFile>${project.build.outputDirectory}/myapp.xml</contextFile>
      <warSourceDirectory>${project.build.directory}/${project.build.finalName}</warSourceDirectory>
    </configuration>