2015-10-21 2 views
0

У меня есть webapp, который включен Maven. Когда я запускаю сборку с mvn install, все выглядит хорошо, классы находятся под WEB-INF/classes, зависимости от maven находятся под WEB-INF/lib, а файл web.xml находится под WEB-INF/, как и следовало ожидать.Tomcat не может найти класс слушателя при запуске из Eclipse

Однако, когда я развертываю из Eclipse с помощью Tomcat 7.x, он не может найти класс слушателя. Сервлет com.test.backend.BackendApplication также не вызывается, даже если он настроен в файле web.xml для загрузки при запуске.

Я заметил, что классы не отображаются под узлом Eclipse «Развернутые ресурсы» в Project Explorer, но я понятия не имею, как заставить его отображаться там.

Вот исключение я получаю:

SEVERE: Error configuring application listener of class com.test.backend.BackendServletContextListener 
java.lang.ClassNotFoundException: com.test.backend.BackendServletContextListener 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547) 
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:532) 
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:514) 
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:142) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4876) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5455) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) 
    at java.util.concurrent.FutureTask.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

Это моя web.xml:

<?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_3_0.xsd" version="3.0"> 
    <display-name>com.test.backend</display-name> 
    <servlet> 
     <servlet-name>jersey-servlet</servlet-name> 
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
     <init-param> 
      <param-name>javax.ws.rs.Application</param-name> 
      <param-value>com.test.backend.BackendApplication</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <listener> 
     <listener-class>com.test.backend.BackendServletContextListener</listener-class> 
    </listener> 
</web-app> 

Мой pom.xml выглядит следующим образом:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.test</groupId> 
    <artifactId>backend</artifactId> 
    <packaging>war</packaging> 
    <version>1.0.0.0</version> 

    <properties> 
     <java.version>1.8</java.version> 
     <maven.version>3.1.0</maven.version> 
     <jersey.version>2.14</jersey.version> 
     <jersey.test.version>2.15</jersey.test.version> 

     <jackson.version>2.5.2</jackson.version> 

     <guice.version>4.0</guice.version> 
    </properties> 

    <dependencies> 
     ...  
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.3</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 

      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.6</version> 
       <executions> 
        <execution> 
         <id>prepare-war</id> 
         <phase>prepare-package</phase> 
         <configuration> 
          <archiveClasses>true</archiveClasses> 
          <archive> 
           <manifest> 
            <addClasspath>true</addClasspath> 
            <classpathPrefix /> 
           </manifest> 
           <manifestEntries> 
            <Implementation-Build>${build.number}</Implementation-Build> 
            <Implementation-Title>${project.name}</Implementation-Title> 
            <Implementation-Vendor>RestApi.com</Implementation-Vendor> 
            <Built-By>${user.name}</Built-By> 
            <Built-OS>${os.name}</Built-OS> 
            <Build-Date>${build.date}</Build-Date> 
           </manifestEntries> 
          </archive> 

          <webResources> 
           <resource> 
            <!-- this is relative to the pom.xml directory --> 
            <directory>./target/${project.artifactId}</directory> 
           </resource> 
          </webResources> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 

</project> 

помощь очень ценим! Я искал часы, но до сих пор не повезло ...

+0

надеюсь, что вы не вручную развернули приложение на tomcat. если да, удалите веб-контент из tomcat/webapps и нажмите содержимое через eclipse. –

+0

Вы проверили «Развертывание сборки» вашего проекта? – Bnrdo

+0

@onepotato Да, сборка установки кажется правильной. Исходная папка src/main/java в WEB-INF/classes, Maven Зависимости в WEB-INF/lib и src/main/webapp в/ –

ответ

0

Щелкните правой кнопкой мыши веб-проект maven, а затем в разделе «Установка» добавьте «папку со списком слушателей в целевой папке».

Например, если ServletContextListener реализация присутствует в package com.company.listeners, сборка, развертывание должно иметь следующее отображение папок:

мишень/<ApplicationName>/WEB-INF/классы/ком/компании/слушателей

должны быть отображены в

WEB-INF/классы/ком/компании/слушателей

Я думаю, что это связано с иерархией загрузчика классов в tomcat и загрузчиком классов, используемым для загрузки слушателей (и классов, доступных для этого загрузчика классов).

Смежные вопросы