2012-08-27 29 views
5

Tôi đang phát triển một ứng dụng web bằng cách sử dụng Vaadin và định cấu hình nó để nó sẽ chạy trong cài đặt phát triển, dàn dựng và sản xuất. Vấn đề của tôi là tôi gặp sự cố khi tải plugin Tomcat7 Maven để chạy tệp chiến tranh của tôi. Các tập tin chiến tranh là tốt - Tôi đã kiểm tra nó với một trình soạn thảo. Tôi đang sử dụng trình giữ chỗ trong tệp spring-context.xml (mà tôi gọi là applicationContext.xml) để đứng trong thông tin cơ sở dữ liệu. Tôi sử dụng bộ lọc tài nguyên Maven để thay thế cho các trình giữ chỗ bằng dữ liệu thực. Điều này làm việc trong tập tin chiến tranh.Chạy tập tin chiến tranh từ một Plugin Tomcat Maven - là plugin sử dụng tệp sai?

Tuy nhiên, khi tôi cố gắng chạy với một plugin Tomcat7 Maven, tôi nhận được lỗi sau (tôi rời ra làm sạch và thông điệp thử nghiệm):

[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}] 

Dưới đây là giải thích của tôi về những gì đang xảy ra. Vui lòng cho tôi biết nếu tôi sai.

Vaadin sử dụng GWT, để được biên dịch. Sau đó, tập tin chiến tranh được lắp ráp và cài đặt. Các tài nguyên được sao chép và lọc. Maven sẽ kiểm tra xem nó có cần phải biên dịch hay không. Sau đó Tomcat khởi động và bắt đầu tự cấu hình. Khi nó được gửi đến dataSource trong applicationContext.xml, nó chokes bởi vì nó tìm các phần giữ chỗ thay vì dữ liệu thực. Nhưng tại sao? Tài nguyên đã chạy, và tập tin chiến tranh và thư mục chiến tranh có dữ liệu chính xác.

Đây là một phần của POM của tôi. Tôi đã thay đổi nó rất nhiều nhưng đây là những gì tôi đã hạ cánh vào lúc:

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

Trả lời

12

Hóa ra đây là một lỗi trong tomcat7-maven-plugin, hoặc ít nhất là nó không được làm việc như tôi mong chờ . Nó KHÔNG sử dụng các tệp cấu hình trong tệp hoặc thư mục chiến tranh khi nó chạy máy chủ Tomcat từ Maven. Bạn có thể thấy điều này trong một dự án Github tôi đã làm:

Click here

EDIT: Được rồi, nó không phải là một lỗi cho mỗi gia nhập, nhưng các plugin Tomcat và các plugin lọc nguồn không nói chuyện với nhau. Không có lý do họ nên, ngoại trừ nếu bạn lọc tài nguyên, plugin Tomcat sẽ không bao giờ tìm thấy chúng.

Bạn phải chỉ định cụ thể cho plugin Tomcat nơi tài nguyên được lọc. Giá trị mặc định là $ {project.build.directory}/$ {project.build.finalName} để bạn có thể thêm cấu hình này vào cấu hình plugin Tomcat của mình:

<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

Tôi không thể hiểu tại sao 'tomcat7: run' là không sử dụng các tài nguyên được lọc được cấu hình trong Maven War Plugin. Đây chính xác là những gì tôi đã mất tích. Theo mặc định, plugin có vẻ sử dụng src/main/webapp làm nguồn WAR của nó, nhưng tôi không thể tìm thấy điều này trong tài liệu Trình cắm Tomcat của Maven. – JeroenHoek

Các vấn đề liên quan