0

I'm developing two spring web application and I would want deploy it on apache tomcat 8.0.3. Now my trouble is that if I put one of the web applications in webapp folder (through tomcat7:deploy) everything work, but if I put both of them in the webapps folder, then only one of the two applications will work. If I try to load the application that does not work and I get a 404 error.

This is the webapp folder structure:

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

I try to access through the following urls:

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

web.xml of MyApp1:

 <?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 of 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> 

This is my 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 

Now I want to ask you How Can I to fix it? And also Is this the best way to manage the deploy of two java webapp, or it would be better have two instances of tomcat each with an application.

13
  • what url are you calling? Have you checked the TC logs to ensure that it has deployed correctly? Commented May 9, 2014 at 7:47
  • Are you sure the second application works when it is alone? Commented May 9, 2014 at 7:48
  • Yes when I try them alone everything works Commented May 9, 2014 at 7:51
  • what is the URL you are using to access the app..? it may be a problem with the context-root. if you are using the same context-root for both the apps, it won't work.. Commented May 9, 2014 at 7:54
  • @BlackPanther I edited my question with the URLs that I'm using to access the apps Commented May 9, 2014 at 8:02

3 Answers 3

2

You don't have to have 2 instances of tomcat to run 2 applications. One is fairly enough. Check if the second application works when it is deployed alone.

Also make sure you have set the context-root of the applications correctly. And check the logs if both the applications are deployed without any error.

Your second application is not deployed. See the following Error:

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 

if you have any <listener> in your web.xml check if that listener throws any exceptions and if you have not handled them. The full exception would be visible in the IDE's console.

From you web.xml i can see that the problem is with the order of the listeners.

Declare the ContextLoaderListener first. And then declare the other listeners followed by it.

From the servlet specification

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. 
Sign up to request clarification or add additional context in comments.

7 Comments

The application are deployed without any error, can you give me an example on context-root configuration?
Why i have to change the context of the apps? I'm trying to access with two different name app1 and app2 and then at what application I should change the name?
i am not saying you should change, i am telling you to verify if the applications are having different context-roots as they should..
Yes, the applications have different context-roots
|
1

Following the suggestion of Black Panther I changed the order of listeners of MyApp2 in this way:

 <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> 

And after this changes I got this exception:

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' 

and I solved it through this answer Change WebApproot in Spring

Anyway now everything works

1 Comment

Good job on clearing the errors.. Choose an answer that solved your problems or create your own answer and accept it...
0

Tomcat is definitely able to handle multiple applications at the same time, it might worth to take a look at the logs of both the spring apps and tomcat's error log and catalina.out to see what can be the issue. Also it might worth to try and "install" the tomcat-manager app also that will allow you to deploy via a web interface that might help you to sort this issue out

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.