Java Webapp runs fine in Eclipse but not in Tomcat

别说谁变了你拦得住时间么 提交于 2021-02-08 07:37:25

问题


I have a small Java/Spring MVC REST /Maven app that runs just fine in Eclipse but also when I run the following command from the prompt:

mvn clean tomcat6:run

My problem is when I do:

mvn clean package

and push the generated war file to the "webapps" folder in my standalone Tomcat instance, the service doesn't work anymore.

The standalone Tomcat starts up just fine, no error in the logs. Interestingly enough though the standalone instance listens on port 8989 vs. 8080 when I run the app in Eclipse or through the mvn command.

Once the app is up in the standalone Tomcat if I try to hit my service w/ RESTClient I get a 404 back. My custom 404 actually, not the generic one.

Also the static content, like my index.html comes up just fine.

Here is my web.xml file:

    <?xml version="1.0" encoding="ISO-8859-1"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <display-name>Skunk User Interface</display-name>

  <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>file:///${APPS_CONFIG}/log4j.xml</param-value>
  </context-param>

  <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  </listener>

  <servlet>
    <servlet-name>skunk</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/skunk-servlet.xml
    </param-value>
  </context-param>

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

  <servlet-mapping>
    <servlet-name>skunk</servlet-name>
    <url-pattern>/skunk/*</url-pattern>
  </servlet-mapping>

  <!-- Healthcheck mapping -->
  <servlet-mapping>
    <servlet-name>skunk</servlet-name>
    <url-pattern>/health/*</url-pattern>
  </servlet-mapping>

  <error-page>
    <error-code>404</error-code>
    <location>/WEB-INF/404.htm</location>
  </error-page>
</web-app>

And the skunk-servlet.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xsi:schemaLocation="
         http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
         http://www.springframework.org/schema/mvc
         http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.1.xsd
         http://www.springframework.org/schema/tx
         http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
         http://www.springframework.org/schema/aop 
         http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
         http://www.springframework.org/schema/cache 
         http://www.springframework.org/schema/cache/spring-cache-3.1.xsd">

    <tx:annotation-driven/>

    <!-- Load configuration settings -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="ignoreUnresolvablePlaceholders" value="true" />
    </bean>

    <bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
      <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
      <property name="searchContextAttributes" value="true" />
      <property name="contextOverride" value="true" />
      <property name="ignoreResourceNotFound" value="true" />
      <property name="locations">
        <list>
          <value>classpath:config/application.properties</value>
          <value>file:///${APPS_CONFIG}/application.properties</value>
        </list>
      </property>
    </bean>

  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
  </bean>

  <bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate" 
    c:dataSource-ref="dataSource" />

  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource">
      <ref bean="dataSource"/>
    </property>
    <property name="hibernateProperties">
      <props>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
      </props>
    </property>
  </bean>

  <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" 
    p:sessionFactory-ref="sessionFactory" />

  <!-- Auto scan the components -->
  <context:component-scan base-package="com.skunk.myapp" />
  <mvc:annotation-driven/>

    <cache:annotation-driven />

    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <property name="cacheManager" ref="ehcache"/>
    </bean>
    <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="configLocation" value="classpath:/ehcache.xml"/>
    </bean> 

  <aop:aspectj-autoproxy proxy-target-class="true" />

</beans>

Is there anything in that configuration that would explain why any request to the dispatcher servlet return 404 instead of routing to the controller?

Thanks


UPDATE:

Adding log outputs from Tomcat Standalone.

catalina.[date].log:

Sep 13, 2012 1:47:28 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jdk1.6.0_31\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;.
Sep 13, 2012 1:47:28 PM org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
Sep 13, 2012 1:47:28 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 673 ms
Sep 13, 2012 1:47:28 PM org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
Sep 13, 2012 1:47:28 PM org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.32
Sep 13, 2012 1:47:28 PM org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor host-manager.xml
Sep 13, 2012 1:47:29 PM org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor manager.xml
Sep 13, 2012 1:47:29 PM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive skunk.war
Sep 13, 2012 1:47:44 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory docs
Sep 13, 2012 1:47:44 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory examples
Sep 13, 2012 1:47:44 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory ROOT
Sep 13, 2012 1:47:44 PM org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
Sep 13, 2012 1:47:44 PM org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
Sep 13, 2012 1:47:44 PM org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/19  config=null
Sep 13, 2012 1:47:44 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 16106 ms

localhost.[date].log:

Sep 13, 2012 1:47:39 PM org.apache.catalina.core.ApplicationContext log
INFO: Set web app root system property: 'webapp.root' = [C:\Users\my.user\Tomcat\webapps\skunk\]
Sep 13, 2012 1:47:39 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing log4j from [file:///${APPS_CONFIG}/log4j.xml]
Sep 13, 2012 1:47:39 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
Sep 13, 2012 1:47:43 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring FrameworkServlet 'skunk'
Sep 13, 2012 1:47:44 PM org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextInitialized()
Sep 13, 2012 1:47:44 PM org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextInitialized()

回答1:


If you merely copy yourproject.war to Tomcat's webapps folder and let the default deployer kick in (which expands yourproject.war to a directory named yourproject) then you should be aware that the default Tomcat logic is to make your app available under the context path (read: URL) of /yourproject.

If you want the app to be available under the root context (/) you should configure Tomcat appropriately.




回答2:


So this is your combination.

App - Environment Status
Eclipse->Working
Eclipse Embedded TOMCAT -> working
Standalone TOMCAT -> Not working

See the Eclipse Tomcat preferences, it might have added class path and library path which would make the Tomcat to identify. Faced similar problem in the past.

Also, your static content works fine. It implies that some important jar to run is present in eclipse classpath which is not visible in Standalone Tomcat.

Cheers




回答3:


Figured it out. I had to change the servlet mapping in web.xml from this:

  <servlet-mapping>
    <servlet-name>skunk</servlet-name>
    <url-pattern>/skunk/*</url-pattern>
  </servlet-mapping>

to this:

  <servlet-mapping>
    <servlet-name>skunk</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

To be able to reach the service using the url:

http://localhost:8080/skunk/myService

The original mapping I had in there meant I would have had to type in:

http://localhost:8080/skunk/skunk/myService

to reach my service... sigh

Thank you guys!



来源:https://stackoverflow.com/questions/12412867/java-webapp-runs-fine-in-eclipse-but-not-in-tomcat

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!