2014-05-09 164 views
0

我正在開發兩個Spring Web應用程序,我希望將它部署在Apache Tomcat 8.0.3上。現在我的麻煩是,如果我把web應用程序中的一個web應用程序放在webapp文件夾中(通過tomcat7:deploy),一切正常,但如果我把它們放在webapps文件夾中,那麼只有兩個應用程序中的一個可以工作。如果我嘗試加載不起作用的應用程序,並且出現404錯誤。Tomcat中的多個Web應用程序

這是Web應用程序文件夾結構:

> $CATALINA_HOME/webapps/ 
> $CATALINA_HOME/webapps/MyApp1/ 
> $CATALINA_HOME/webapps/MyApp1/... 
> $CATALINA_HOME/webapps/MyApp2/ 
> $CATALINA_HOME/webapps/MyApp2/... 

我嘗試通過以下網址訪問:

> http://localhost:8080/MyApp1 
> http://localhost:8080/MyApp2 

MyApp1的web.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app> 
    <display-name>MyApp1</display-name> 


    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath*:spring-MyApp1-context.xml</param-value> 
    </context-param> 

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

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

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

    <session-config> 
     <session-timeout>30</session-timeout> 
    </session-config> 

    <servlet> 
     <servlet-name>MyApp1Servlet</servlet-name> 
     <servlet-class>it.myCompany.servlet.springVaadin.AutowiringApplicationServlet</servlet-class> 
     <init-param> 
      <description>Vaadin UI class to use</description> 
      <param-name>UI</param-name> 
      <param-value>it.myCompany.vaadin.application.myApplication</param-value> 
     </init-param> 
    </servlet> 

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

</web-app> 

的web.xml MyApp2:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app> 
    <display-name>MyApp2</display-name> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath*:spring-MyApp2-context.xml</param-value> 
    </context-param> 

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

    <servlet> 
     <servlet-name>MyApp2Servlet</servlet-name> 
     <servlet-class>it.myCompany.servlet.springVaadin.AutowiringApplicationServlet</servlet-class> 
     <init-param> 
      <description>Vaadin UI class to use</description> 
      <param-name>UI</param-name> 
      <param-value>it.myCompany.vaadin.application.myUI</param-value> 
     </init-param> 


    </servlet> 


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

    <session-config> 
     <session-timeout>30</session-timeout> 
    </session-config> 

</web-app> 

這是我的catalina.out的:

09-May-2014 09:24:24.956 INFO [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. 
INFO ContextLoader - Root WebApplicationContext: initialization started 
INFO XmlWebApplicationContext - Refreshing Root WebApplicationContext: startup date [Fri May 09 09:24:25 CEST 2014]; root of context hierarchy 
INFO XmlBeanDefinitionReader - Loading XML bean definitions from URL [file:/home/user/apache-tomcat-8.0.3/webapps/MyApp1/WEB-INF/classes/spring-context.xml] 
INFO ClassPathBeanDefinitionScanner - JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning 
INFO XmlBeanDefinitionReader - Loading XML bean definitions from URL [file:/home/user/apache-tomcat-8.0.3/webapps/MyApp1/WEB-INF/classes/database.xml] 
INFO XmlWebApplicationContext - Bean 'org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver#17f0811' of type [class org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 
INFO XmlWebApplicationContext - Bean 'eclipseLinkJpaVendorAdapter' of type [class org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 
INFO LocalContainerEntityManagerFactoryBean - Building JPA container EntityManagerFactory for persistence unit 'MyApp1Unit' 
INFO XmlWebApplicationContext - Bean 'entityManagerFactory' of type [class org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 
INFO XmlWebApplicationContext - Bean 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0' of type [class org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 
INFO XmlWebApplicationContext - Bean 'org.springframework.transaction.config.internalTransactionAdvisor' of type [class org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 
[EL Info]: 2014-05-09 09:24:58.84--ServerSession(28685765)--EclipseLink, version: Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5 
[EL Info]: connection: 2014-05-09 09:25:03.114--ServerSession(28685765)--file:/home/user/apache-tomcat-8.0.3/webapps/MyApp1/WEB-INF/lib/model-0.0.1-SNAPSHOT.jar_MyApp1Unit login successful 
INFO ContextLoader - Root WebApplicationContext: initialization completed in 47167 ms 
09-May-2014 09:25:12.644 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive /home/user/apache-tomcat-8.0.3/webapps/MyApp2.war 
09-May-2014 09:25:12.646 WARNING [localhost-startStop-1] org.apache.catalina.startup.SetContextPropertiesRule.begin [SetContextPropertiesRule]{Context} Setting property 'antiJARLocking' to 'true' did not find a matching property. 
09-May-2014 09:25:35.098 INFO [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. 
log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 
[EL Info]: 2014-05-09 09:26:02.022--SessionBroker(5894789)--EclipseLink, version: Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5 
[EL Info]: connection: 2014-05-09 09:26:02.631--ServerSession(14644967)--MyApp1Unit login successful 
[EL Info]: connection: 2014-05-09 09:26:02.779--ServerSession(33125502)--MyApp2Unit login successful 
[EL Info]: connection: 2014-05-09 09:26:06.366--SessionBroker(5894789)--file:/home/user/apache-tomcat-8.0.3/webapps/MyApp2/WEB-INF/lib/model-composite-0.0.1-SNAPSHOT.jar_compositeUnit login successful 
09-May-2014 09:26:07.692 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal Error listenerStart 
09-May-2014 09:26:07.693 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal Context [/MyApp2] startup failed due to previous errors 
[EL Info]: connection: 2014-05-09 09:26:07.707--ServerSession(14644967)--MyApp1Unit logout successful 
[EL Info]: connection: 2014-05-09 09:26:07.708--ServerSession(33125502)--MyApp2Unit logout successful 
09-May-2014 09:26:07.715 SEVERE [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoader.clearReferencesJdbc The web application [/MyApp2] registered the JDBC driver [oracle.jdbc.driver.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 
09-May-2014 09:26:08.277 INFO [main] org.apache.catalina.startup.Catalina.start 

09-May-2014 09:26:07.719 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /home/user/apache-tomcat-8.0.3/webapps/host-manager 
09-May-2014 09:26:07.772 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /home/user/apache-tomcat-8.0.3/webapps/manager 
09-May-2014 09:26:07.797 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /home/user/apache-tomcat-8.0.3/webapps/examples 
09-May-2014 09:26:08.233 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /home/user/apache-tomcat-8.0.3/webapps/ROOT 
09-May-2014 09:26:08.250 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /home/user/apache-tomcat-8.0.3/webapps/docs 
Server startup in 135339 ms 

現在我想請你教我如何解決?還有,這是管理兩個java webapp的部署的最好方式,還是最好有兩個tomcat實例,每個實例都有一個應用程序。

+0

什麼網址你打電話?您是否檢查過TC日誌以確保它已正確部署? –

+0

你確定第二個應用程序是獨立的嗎? –

+0

是的,當我單獨嘗試一切時,一切正常 – Skizzo

回答

1

繼黑豹的建議,我改變了MyApp2的聽衆的順序是這樣的:

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

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

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

,這將改變後,我得到這個異常:

Grave: Exception sending context initialized event to listener instance of class org.springframework.web.util.Log4jConfigListener java.lang.IllegalStateException: Web app root system property already set to dif 
ferent value: 'webapp.root' 

我通過這個答案解決了它呃Change WebApproot in Spring

無論如何現在一切正常

+0

清理錯誤的工作很好..選擇一個解決您的問題或創建自己的答案並接受它的答案... –

+0

感謝您的時間 – Skizzo

0

Tomcat絕對能夠同時處理多個應用程序,可能值得查看兩個spring應用程序和tomcat的錯誤日誌以及catalina.out的日誌,以查看可能存在的問題。另外它也許值得去嘗試和「安裝」tomcat-manager應用程序,它也允許你通過web接口進行部署,這可能會幫助你排除這個問題。

2

你不必擁有2個tomcat實例運行2個應用程序。一個就夠了。 檢查第二個應用程序是否在單獨部署時運行。

另外請確保您已正確設置應用程序的上下文根。如果兩個應用程序都沒有任何錯誤地部署,請檢查日誌。

您的第二個應用程序未部署。看到以下錯誤:

09-May-2014 09:26:07.692 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal Error listenerStart 
09-May-2014 09:26:07.693 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal Context [/MyApp2] startup failed due to previous errors 

,如果你在你的web.xml檢查有任何<listener>如果聽衆拋出任何異常,如果你還沒有處理他們。完整的異常將在IDE的控制檯中可見。

從你web.xml我可以看到問題是與聽衆的順序。

首先聲明ContextLoaderListener。然後聲明其他 聽衆。

從Servlet規範

8.2.3 Assembling the descriptor

The ordering will be based on the order in which they are defined in the descriptor and on the absolute-ordering element in the web.xml or an ordering element in the web-fragment.xml, if present.

a. Filters that match a request are chained in the order in which they are declared in the web.xml.

b. Servlets are initialized either lazily at request processing time or eagerly during deployment. In the latter case, they are initialized in the order indicated by their load-on-startup elements.

c. Prior to this release of the specification, context listeners were invoked in random order. As of Servlet 3.0, the listeners are invoked in the order in which they are declared in the web.xml as specified below:

i. Implementations of javax.servlet.ServletContextListener are 
    invoked at their contextInitialized method in the order in which they 
    have been declared, and at their contextDestroyed method in reverse 
    order.Chapter 8 Annotations and pluggability 73 

ii. Implementations of javax.servlet.ServletRequestListener are 
    invoked at their requestInitialized method in the order in which they 
    have been declared, and at their requestDestroyed method in reverse 
    order 

iii. Implementations of javax.servlet.http.HttpSessionListener are 
    invoked at their sessionCreated method in the order in which they have 
    been declared, and at their sessionDestroyed method in reverse order. 
+0

應用程序部署沒有任何錯誤,你能給我一個關於上下文根配置的例子嗎? – Skizzo

+0

檢查[**這個答案**](http://stackoverflow.com/questions/2437465/java-how-to-change-context-root-of-a-dynamic-web-project-in-eclipse) –

+0

爲什麼我必須更改應用程序的上下文?我試圖訪問兩個不同的名稱** app1 **和** app2 **,然後在什麼應用程序中我應該更改名稱? – Skizzo

相關問題