在多模块项目中使用配置文件

时间:2012-08-13 19:06:53

标签: maven-3 maven-profiles

我有一个多模块maven项目。项目布局如下所述:

PARENT
  |-CHILD1
  |-CHILD2

父项目具有pom打包类型,并将CHILD1CHILD2项目声明为模块。此外,PARENT项目声明了一个声明属性的配置文件dev。 CHILD1项目有罐装包装类型和"覆盖" PARENT dev配置文件通过添加一些依赖项(例如依赖于commons-collections)。 CHILD2项目具有战争包装类型,并且依赖于CHILD1项目。 CHILD2"覆盖"通过添加另一个依赖项(例如,dev的依赖关系}父commons-io个人资料,我的意思是与项目CHILD1中的依赖关系无关的依赖关系。 然后,当我运行mvn clean install -Pdev时,maven没有将commons-collections.jar(在CHILD1项目中声明的依赖项)放到CHILD2项目的WEB-INF/lib,但是commons-io.jar就在那里。

所以,问题是:如果目标项目在该配置文件中声明另一组依赖项,为什么maven不会从目标项目的依赖项目中声明的配置文件中放置依赖项?

实际上我有更多项目和更多依赖项,这些项目在不同的配置文件中有所不同。我想在该项目pom.xml中声明项目特定的依赖项(假设在项目中声明配置文件将"覆盖"父配置文件声明)

1 个答案:

答案 0 :(得分:2)

我假设您希望能够在开发时在本地进行测试,针对暂存环境测试您的更改,最后部署到生产环境。

您需要记住的关键事项是,当工件部署到本地/远程存储库时,活动配置文件不是部署的部分,因此当您通过配置文件添加依赖项时,事情变得非常危险你无法知道webapp是在DEV配置文件处于活动状态还是PROD配置文件处于活动状态的情况下构建的,然后当这个构建的工件部署到生产环境中时,你可能会被搞砸了。

所以缺点是你确保你的工件独立于部署环境。

这意味着,例如,您将从以下位置获取配置:

  • 类路径上的文件
  • 系统属性
  • jndi条目

例如,如果部署到Tomcat,您可以将configuration.properties放入$CATALINA_HOME/lib

启动时的webapp将使用getClass().getResource('/configuration.properties')来解析属性文件,如果文件丢失,则无法启动(快速失败)

您可以通过在src/test/resources中放置一个测试版本的configuration.properties来让您的单元/集成测试使用不同的配置。

您对应用程序的<scope>provided</scope>样式依赖项使用相同的原则。换言之,容器应提供容器与提供合同的依赖性。因此,您可以使用Maven为自己构建tomcat / jetty的生产版本,并将所需的依赖项添加到该程序集中。这就像生产版本使用MySQL数据库一样,所以你需要将mysql-jdbc驱动程序添加到$CATALINA_HOME/lib。使用程序集插件执行此操作相对容易,因为您只需重新打包包含一些位和其他排除的zip。

在本地测试时,您需要使用辅助插件'run目标,例如jetty:runtomcat:run。这里的解决方案是通过配置文件提供这些插件依赖项没有任何问题,因为您不会影响工件的依赖性您只影响插件的类路径。

e.g。

<project>
  <!-- ... some stuff .. -->
  <profiles>
     <profile>
       <id>DEV</id>
       <build>
         <plugins>
           <plugin>
             <groupId>org.mortbay.jetty</groupId>
             <artifactId>jetty-maven-plugin</artifactId>
             <dependencies>
               <dependency>
                 <groupId>commons-dbcp</groupId>
                 <artifactId>commons-dbcp</artifactId>
                 <version>1.4</version>
               </dependency>
               <dependency>
                 <groupId>mysql</groupId>
                 <artifactId>mysql-connector-java</artifactId>
                 <version>5.1.18</version>
               </dependency>
             </dependencies>
           </plugin>
         </plugins>
       </build>
     </profile>
   </profiles>
 </project>

您还可以配置系统属性或类路径添加以提取所需的配置文件。

所有这些的最终结果是工件保持与环境无关,您可以轻松地针对各种环境进行测试

希望这能回答你的问题(即使是侧身)