我正在使用NetBeans,Tomcat似乎两次在.war应用程序中进行了部署,这是Web应用程序的两次启动。
我已经尝试了Tomcat 6和Tomcat 7,并且结果相同。
我有一个Spring MVC,Hibernate和Thymeleaf应用程序。META-INF下的Context.xml具有以下内容:
<?xml version="1.0" encoding="UTF-8"?> <Context path="/website"/>
这是日志。
**First deployment starts** [ INFO] 07:13:09 ContextLoader - Root WebApplicationContext: initialization started [ INFO] 07:13:09 XmlWebApplicationContext - Refreshing Root WebApplicationContext: startup date [Thu May 23 07:13:09 EST 2013]; root of context hierarchy 2013-05-23 07:13:10 JRebel: Monitoring Spring bean definitions in '/Users/pack/NetBeansProjects/mysite/site/src/main/webapp/WEB-INF/applicationContext- data.xml'. [ INFO] 07:13:10 XmlBeanDefinitionReader - Loading XML bean definitions from ServletContext resource [/WEB-INF/applicationContext-data.xml] [ INFO] 07:13:10 ClassPathScanningCandidateComponentProvider - JSR-330 'javax.inject.Named' annotation found and supported for component scanning ***(tomcat initializes hibernate and other spring beans)*** ... May 23, 2013 7:13:17 AM org.apache.catalina.startup.Catalina start INFO: Server startup in 15552 ms ***Tomcat started*** ***Tomcat tries to shut down the context*** [ INFO] 07:13:18 XmlWebApplicationContext - Closing WebApplicationContext for namespace 'spring-mvc-servlet': startup date [Thu May 23 07:13:15 EST 2013]; parent: Root WebApplicationContext [ INFO] 07:13:18 DefaultListableBeanFactory - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@5bbe2de2: defining beans [blHeadProcessor,blHeadProcessorExtensionManager,navigationProcessor,blPaginationPageLinkPro cessor,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,blRegisterCustomerValidator,blCategoryController,com.package.ui.thymeleaf.CategoryHandlerMapping#0,templateResolver,templateEngine,org.thymeleaf.spring3.view.ThymeleafViewResolver#0,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; parent: org.springframework.beans.factory.support.DefaultListableBeanFactory@521e7f21 [ INFO] 07:13:18 XmlWebApplicationContext - Closing Root WebApplicationContext: startup date [Thu May 23 07:13:09 EST 2013]; root of context hierarchy [ INFO] 07:13:18 DefaultListableBeanFactory - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@521e7f21: defining beans [org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.context.support.PropertySourcesPlaceholderConfigurer#0,blCategoryDao,blCustomerDao,blIdGenerationDao,nlpDao,jpaTemplate,webDS,entityManagerFactory,transactionManager,org.springframework.security.filterChains,org.springframework.security.filterChainProxy,org.springframework.security.web.DefaultSecurityFilterChain#0,org.springframework.security.web.DefaultSecurityFilterChain#1,org.springframework.security.web.DefaultSecurityFilterChain#2,org.springframework.security.web.DefaultSecurityFilterChain#3,org.springframework.security.web.DefaultSecurityFilterChain#4,org.springframework.security.web.DefaultSecurityFilterChain#5,org.springframework.security.web.PortMapperImpl#0,org.springframework.security.web.PortResolverImpl#0,org.springframework.security.authentication.ProviderManager#0,org.springframework.security.web.context.HttpSessionSecurityContextRepository#0,org.springframework.security.web.savedrequest.HttpSessionRequestCache#0,org.springframework.security.web.access.channel.ChannelDecisionManagerImpl#0,org.springframework.security.access.vote.AffirmativeBased#0,org.springframework.security.web.access.intercept.FilterSecurityInterceptor#0,org.springframework.security.web.access.DefaultWebInvocationPrivilegeEvaluator#0,org.springframework.security.authentication.AnonymousAuthenticationProvider#0,org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0,org.springframework.security.userDetailsServiceFactory,org.springframework.security.web.DefaultSecurityFilterChain#6,org.springframework.security.authentication.dao.DaoAuthenticationProvider#0,org.springframework.security.authentication.DefaultAuthenticationEventPublisher#0,org.springframework.security.authenticationManager,blUserDetailsService,blCatalogService,blCustomerService,entityService,fbPageService,blIdGenerationService,blLoginService,nlpService,priceIncreaseValidator,searchFacetService,blEntityConfiguration,blPasswordEncoder,solrIndexService,solrEmbedded,textEncryptor,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy [ INFO] 07:13:18 LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'blPU' [ INFO] 07:13:18 SessionFactoryImpl - closing May 23, 2013 7:13:18 AM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc SEVERE: The web application [/website] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. May 23, 2013 7:13:19 AM org.apache.catalina.startup.HostConfig deleteRedeployResources INFO: Undeploying context [/website] May 23, 2013 7:13:19 AM org.apache.catalina.startup.HostConfig deployDescriptor INFO: Deploying configuration descriptor /Users/pack/Servers/apache-tomcat- 7.0.34/conf/Catalina/localhost/website.xml 2013-05-23 07:13:23 JRebel: Monitoring Log4j configuration in 'file:/Users/pack/NetBeansProjects/mysite/site/target/mycompany/WEB-INF/classes/log4j.xml'. ***Tomcat tries to restart again*** [ INFO] 07:13:23 ContextLoader - Root WebApplicationContext: initialization started [ INFO] 07:13:23 XmlWebApplicationContext - Refreshing Root WebApplicationContext: startup date [Thu May 23 07:13:23 EST 2013]; root of context hierarchy 2013-05-23 07:13:24 JRebel: Monitoring Spring bean definitions in '/Users/pack/NetBeansProjects/mysite/site/src/main/webapp/WEB-INF/applicationContext- data.xml'. [ INFO] 07:13:24 XmlBeanDefinitionReader - Loading XML bean definitions from ServletContext resource [/WEB-INF/applicationContext-data.xml]
它成功启动。
我不明白的是为什么Tomcat两次部署应用程序。第一次在新的tomcat实例上部署应用程序时不会发生这种情况,因为website.xml文件尚未位于tomcats / conf / catalina / localhost文件夹中。但是,当我停止并再次从netbeans运行tomcat时,website.xml文件仍然位于/ conf / catalina / localhost文件夹中,但是在即将进行第二次部署之前将其删除并重新部署。
我尝试将autoDeployTomcat的server.xml文件中的设置设置为false,但这没有帮助。
autoDeploy
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="false">
可能是Tomcat每当每次tomcat停止时都应该删除/ conf / catalina / localhost文件夹下的website.xml文件。
这是localhost文件夹下的website.xml文件的样子
<?xml version="1.0" encoding="UTF-8"?> <Context docBase="/Users/pack/NetBeansProjects/mysite/site/target/mycompany" path="/website" />
我发现删除文件conf / localhost / myappname.xml会阻止应用初始化两次。基本上,Tomcat正在重新启动,然后重新启动旧版本的应用程序。然后,在Netbeans部署它时再次启动。解决方法是,在ContextListener contextDestroyed()事件中添加了几行代码:
public void contextDestroyed(ServletContextEvent sce) { ... String delme = sce.getServletContext().getInitParameter("eraseOnExit"); if (delme != null && delme.length() > 0) { File del = new File(delme); if (del.exists()) { System.out.println("Deleting file " + delme); del.delete(); } }
在web.xml中,在开发环境中添加以下内容:
<context-param> <description>Workaround for Tomcat starting webapp twice</description> <param-name>eraseOnExit</param-name> <param-value>/Users/xxx/apache-tomcat-7.0.42/conf/Catalina/localhost/myappname.xml</param-value> </context-param>
然后,下次部署该应用程序时,将不会在部署之前再次启动它,因此不会启动两次。在部署之前或关闭时删除文件的任何其他想法将不胜感激。