2012-08-27 8 views
5

Pracuję nad aplikacją internetową przy użyciu programu Vaadin i konfiguruję ją tak, aby działała w środowisku programistycznym, testowym i produkcyjnym. Mój problem polega na tym, że mam problem z pobraniem wtyczki Tomcat7 Maven do uruchomienia pliku wojny. Plik wojenny jest w porządku - sprawdziłem go za pomocą edytora. Używam symboli zastępczych w moim pliku kontekstowym.xml (który nazywam applicationContext.xml), aby uzyskać informacje o bazie danych. Używam filtrowania zasobów Mavena, aby zastąpić posiadaczy miejsc rzeczywistymi danymi. Działa to w pliku wojennym.Uruchamianie pliku wojny z wtyczki Maven Tomcat - czy używasz niewłaściwego pliku?

Jednak, gdy staram się uruchomić wtyczki Tomcat7 Maven, pojawia się następujący błąd (Pominąłem czyszczenie i wiadomości testowych):

[INFO] 
[INFO] --- gwt-maven-plugin:2.4.0:compile (default) @ dpt --- 
[INFO] auto discovered modules [com.catalystitservices.nike.dpt.widgetset.DptWidgetset] 
[INFO] com.catalystitservices.nike.dpt.widgetset.DptWidgetset is up to date. GWT compilation skipped 
[INFO] 
[INFO] --- maven-war-plugin:2.2:war (default-war) @ dpt --- 
[INFO] Packaging webapp 
[INFO] Assembling webapp [dpt] in [C:\Projects\DPT\target\dpt] 
[INFO] Processing war project 
[INFO] Copying webapp webResources [C:\Projects\DPT\src/main/webapp/] to [C:\Projects\DPT\target\dpt] 
[INFO] Copying webapp resources [C:\Projects\DPT\src\main\webapp] 
[INFO] Webapp assembled in [1407 msecs] 
[INFO] Building war: C:\Projects\DPT\target\dpt.war 
[INFO] 
[INFO] --- maven-install-plugin:2.3.1:install (default-install) @ dpt --- 
[INFO] Installing C:\Projects\DPT\target\dpt.war to C:\Users\ksnortum\.m2\repository\com\nike\dpt\dpt\1.1-SNAPSHOT\dpt-1.1-SNAPSHOT.war 
[INFO] Installing C:\Projects\DPT\pom.xml to C:\Users\ksnortum\.m2\repository\com\nike\dpt\dpt\1.1-SNAPSHOT\dpt-1.1-SNAPSHOT.pom 
[INFO] 
[INFO] >>> tomcat-maven-plugin:1.1:run (default-cli) @ dpt >>> 
[INFO] 
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ dpt --- 
[debug] execute contextualize 
[INFO] Using 'UTF-8' encoding to copy filtered resources. 
[INFO] Copying 3 resources 
[INFO] Copying 3 resources 
[INFO] 
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ dpt --- 
[INFO] Nothing to compile - all classes are up to date 
[INFO] 
[INFO] <<< tomcat-maven-plugin:1.1:run (default-cli) @ dpt <<< 
[INFO] 
[INFO] --- tomcat-maven-plugin:1.1:run (default-cli) @ dpt --- 
[INFO] Running war on http://localhost:8080/dpt 
[INFO] Creating Tomcat server configuration at C:\Projects\DPT\target\tomcat 
Aug 27, 2012 2:51:57 PM org.apache.catalina.startup.Embedded start 
INFO: Starting tomcat server 
Aug 27, 2012 2:51:57 PM org.apache.catalina.core.StandardEngine start 
INFO: Starting Servlet Engine: Apache Tomcat/6.0.29 
Aug 27, 2012 2:51:58 PM org.apache.catalina.core.ApplicationContext log 
INFO: Set web app root system property: 'webapp.root' = [C:\Projects\DPT\src\main\webapp\] 
Aug 27, 2012 2:51:58 PM org.apache.catalina.core.ApplicationContext log 
INFO: Initializing log4j from [classpath:log4j.properties] 
Aug 27, 2012 2:51:58 PM org.apache.catalina.core.ApplicationContext log 
INFO: Initializing Spring root WebApplicationContext 
27.08.2012 14:51:58 INFO (ContextLoader.java:272) - Root WebApplicationContext: initialization started 
27.08.2012 14:51:58 INFO (AbstractApplicationContext.java:500) - Refreshing Root WebApplicationContext: startup date [Mon Aug 27 14:51:58 PDT 2012]; root of context hierarchy 
27.08.2012 14:51:58 INFO (XmlBeanDefinitionReader.java:315) - Loading XML bean definitions from ServletContext resource [/WEB-INF/applicationContext.xml] 
27.08.2012 14:51:58 INFO (XmlBeanDefinitionReader.java:315) - Loading XML bean definitions from ServletContext resource [/WEB-INF/applicationContext-security.xml] 
27.08.2012 14:51:59 INFO (SpringSecurityCoreVersion.java:33) - You are running with Spring Security Core 3.1.0.RELEASE 
27.08.2012 14:51:59 INFO (SecurityNamespaceHandler.java:57) - Spring Security 'config' module version is 3.1.0.RELEASE 
27.08.2012 14:51:59 INFO (HttpSecurityBeanDefinitionParser.java:229) - Checking sorted filter chain: [Root bean: class [org.springframework.security.web.context.SecurityContextPersistenceFilter]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null, order = 300, Root bean: class [org.springframework.security.web.authentication.logout.LogoutFilter]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null, order = 400, <org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0>, order = 800, Root bean: class [org.springframework.security.web.authentication.www.BasicAuthenticationFilter]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null, order = 1200, Root bean: class [org.springframework.security.web.savedrequest.RequestCacheAwareFilter]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null, order = 1300, Root bean: class [org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null, order = 1400, Root bean: class [org.springframework.security.web.authentication.AnonymousAuthenticationFilter]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null, order = 1700, Root bean: class [org.springframework.security.web.session.SessionManagementFilter]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null, order = 1800, Root bean: class [org.springframework.security.web.access.ExceptionTranslationFilter]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null, order = 1900, <org.springframework.security.web.access.intercept.FilterSecurityInterceptor#0>, order = 2000] 
27.08.2012 14:51:59 INFO (PropertiesLoaderSupport.java:177) - Loading properties file from file [C:\Projects\DPT\target\classes\log4j.properties] 
27.08.2012 14:51:59 INFO (DefaultSingletonBeanRegistry.java:433) - Destroying singletons in org.s[email protected]3358fd70: defining beans [org.springframework.context.support.PropertySourcesPlaceholderConfigurer#0,cdbController,forecastController,genericGridController,productionPlanController,productionScheduleReportController,actualsDao,cdbDao,dateDimDao,developerDao,factoryCapacityOverrideDao,factoryDao,familyDao,forecastDao,globalTotalOverrideDao,linePlanDao,modelOfferingDao,multiSourceDao,productionCategoryDao,productionPlanDao,regionDao,dptApplication,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.config.internalBeanConfigurerAspect,org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#0,org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#0,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,txManager,messageSource,localeResolver,com.catalystitservices.nike.util.VaadinApplicationObjectSupport#0,dataSource,jdbcTemplate,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.PortMapperImpl#0,org.springframework.security.config.authentication.AuthenticationManagerFactoryBean#0,org.springframework.security.authentication.ProviderManager#0,org.springframework.security.web.context.HttpSessionSecurityContextRepository#0,org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy#0,org.springframework.security.web.savedrequest.HttpSessionRequestCache#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.www.BasicAuthenticationEntryPoint#0,org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0,org.springframework.security.userDetailsServiceFactory,org.springframework.security.web.DefaultSecurityFilterChain#3,org.springframework.security.provisioning.InMemoryUserDetailsManager#0,org.springframework.security.authentication.dao.DaoAuthenticationProvider#0,org.springframework.security.authentication.DefaultAuthenticationEventPublisher#0,org.springframework.security.authenticationManager,org.springframework.security.access.method.DelegatingMethodSecurityMetadataSource#0,org.springframework.security.access.vote.AffirmativeBased#1,org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor#0,org.springframework.security.methodSecurityMetadataSourceAdvisor,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0]; root of factory hierarchy 
Aug 27, 2012 2:51:59 PM org.apache.catalina.core.StandardContext listenerStart 
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener 
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'dataSource' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Could not resolve placeholder 'db.driverClassName' in string value [${db.driverClassName}] 

Oto moja interpretacja tego, co się dzieje. Proszę mi powiedzieć, czy się mylę.

Vaadin używa GWT, więc zostanie skompilowany. Następnie plik wojenny zostanie złożony i zainstalowany. Zasoby są kopiowane i filtrowane. Maven sprawdza, czy trzeba skompilować, ale tak nie jest. Następnie Tomcat uruchamia się i zaczyna się konfigurować. Gdy dociera do źródła danych w pliku applicationContext.xml, dławi się, ponieważ znajduje zastępcze zamiast rzeczywistych danych. Ale dlaczego? Zasoby zostały już uruchomione, a plik wojenny i katalog wojenny mają poprawne dane.

Oto części mojego POM. Zmieniłem go dużo, ale to co mam wylądował na:

<build> 
    <finalName>dpt</finalName> 

    <filters> 
     <filter>src/main/resources/props/dev.properties</filter> 
    </filters> 

    <resources> 
     <resource> 

      <!-- Currently, log4j.properties --> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 

      <includes> 
       <include>**/*.properties</include> 
      </includes> 
     </resource> 
    </resources> 

    <plugins> 

     <!-- WAR file plugin --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>${mavenWarPlugin}</version> 

      <configuration> 
       <packagingExcludes>WEB-INF/web.xml</packagingExcludes> 
       <warName>dpt</warName> 

       <filters> 
        <filter>src/main/resources/props/dev.properties</filter> 
       </filters> 

       <webResources> 
        <resource> 

         <!-- Currently, spring context files --> 
         <directory>src/main/webapp/</directory> 
         <filtering>true</filtering> 

         <includes> 
          <include>**/*.xml</include> 
         </includes> 
        </resource> 
       </webResources> 
      </configuration> 
     </plugin> 

Odpowiedz

12

Okazuje się, że jest to błąd w tomcat7-maven-plugin, albo przynajmniej nie działa jak spodziewałbym . NIE używa plików konfiguracyjnych w pliku wojny lub katalogu, gdy uruchamia serwer Tomcat z Maven. Można to zobaczyć w projekcie GitHub robiłam:

Click here

EDIT: Dobrze, że nie jest to bug per se, ale plugin Tomcat i wtyczki filtrowanie zasobów nie rozmawiają ze sobą. Nie ma powodu, dla którego powinny, z wyjątkiem tego, że jeśli filtrujesz zasoby, wtyczka Tomcat nigdy ich nie znajdzie.

Musisz wyraźnie powiedzieć wtyczce Tomcat, gdzie są filtrowane zasoby. Wartość domyślna to $ {project.build.directory}/$ {project.build.finalName} więc można dodać to do konfiguracji wtyczki Tomcat:

<project> 
    ... 
    <build> 
    ... 
    <plugins> 
     ... 
     <plugin> 
     <groupId>org.apache.tomcat.maven</groupId> 
     <artifactId>tomcat7-maven-plugin</artifactId> 
     <version>${tomcat7MavenPlugin}</version> 

     <configuration> 
      ... 

      <!-- Have Tomcat look in the file filtering folder --> 
      <warSourceDirectory> 
      ${project.build.directory}/${project.build.finalName} 
      </warSourceDirectory> 
     </configuration> 
     ... 
+1

nie mogłem zrozumieć, dlaczego 'tomcat7: run' było nie używając filtrowanych zasobów skonfigurowanych w Plugin Maven War. Tego właśnie mi brakowało. Domyślnie wtyczka wydaje się używać src/main/webapp jako źródła WAR, ale nie mogłem znaleźć tego w dokumentacji Maven Tomcat Plugin. – JeroenHoek