2012-08-13 43 views
0

我有一个multimodule maven项目。项目布局如下描述:在多模块项目中使用配置文件

PARENT 
    |-CHILD1 
    |-CHILD2 

父项目有聚甲醛包装类型和声明CHILD1CHILD2项目为模块。另外PARENT项目声明配置文件dev其中声明了一些属性。 CHILD1项目通过添加一些依赖项(例如依赖于commons-collections)具有jar包装类型并“覆盖”父项dev配置文件。 CHILD2项目具有战争包装类型并且依赖于CHILD1项目。此外,CHILD2通过添加其他依赖项(例如,依赖于commons-io,我的意思是与项目CHILD1中的依赖项无关)来“覆盖”父级dev配置文件。 然后当我运行mvn clean install -Pdev maven不把commons-collections.jar(在CHILD1项目中声明的依赖项)放到CHILD2项目的WEB-INF/lib,但是commons-io.jar在那里。

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

其实我有更多的项目和更多的依赖项,在不同的配置文件中有所不同。我想在该项目pom.xml中声明项目特定的依赖关系(假设在项目中声明配置文件将“覆盖”父配置文件声明)

+2

添加依赖关系是**主要反模式**并且不应该在原始POM格式规范中被允许。 – 2012-08-14 08:15:49

+0

如何在不同配置文件中需要不同配置的情况下采取行动?我需要排除某些配置文件中的某些依赖关系 – maks 2012-08-14 08:30:24

+0

使用不同的模块和webapp叠加层将模块通过配置文件添加到反应器中。 IOW您将拥有三个或四个webapp模块,除了基本webapp和您需要的附加依赖关系之外,其余所有模块都将为'空' – 2012-08-14 08:36:45

回答

2

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

需要牢记的关键是,当工件部署到本地/远程存储库时,活动配置文件不是部署的部分,因此当通过配置文件添加依赖关系时,事情变得非常危险因为您无法知道该Web应用程序是否是在DEV配置文件处于活动状态或PROD配置文件处于活动状态的情况下构建的,然后当将构建的工件部署到生产环境中时,您可能会被严格控制。

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

这意味着,例如,你会捡起配置:

  • 文件在classpath
  • 系统属性
  • JNDI条目

因此,举例来说,如果部署到Tomcat,你可能会把一个configuration.properties放入$CATALINA_HOME/lib

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

您可以通过将测试版本放入您的设备/集成测试中来使用其他配置configuration.properties中的src/test/resources

对应用程序的<scope>provided</scope>样式依赖关系使用相同的原则。换句话说,集装箱与提供合同的依赖关系应该由集装箱提供。因此,您可以使用Maven为自己构建生产版本的tomcat/jetty,并将所需的依赖项添加到该程序集中。这将是生产版本使用MySQL数据库的情况,所以您需要将mysql-jdbc驱动程序添加到$CATALINA_HOME/lib。使用程序集插件执行此操作相对容易,因为您实际上只是重新包装了一些包含某些位的zip文件,而另一些则排除了该zip文件。

当您在本地进行测试时,您会希望使用帮助插件'run的目标,如jetty:runtomcat:run。这里的解决方案是,通过配置文件提供这些插件依赖关系没有任何问题,因为您不会影响工件的依赖关系,因此您只影响插件的类路径。

例如

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

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

所有这一切的最终结果是神器保持环境独立,可以针对不同的环境中轻松地测试

希望这回答了你的问题(即使横向)的轮廓

+0

它不依赖于环境。我只想排除一些依赖关系或提供依赖关系,而不使用某些传递性或基于(例如)maven build命令的输入参数为不同的作用域提供依赖关系。为了提供有关配置文件信息的工件,我可以使用分类器并在不同的配置文件中激活它(分类器)。所以问题仍然是开放的 – maks 2012-08-14 15:14:00

+1

分类器具有与主要工件相同的依赖关系,因此分类器是一个错误的解决方案。 Maven很自以为是,你正在试图做一件它坚决认为是“坏事”的事情,所以最终的结果是你会一路战斗......祝你好运....祝你好运6个月后,试图弄清楚你做了什么! – 2012-08-14 16:25:28

相关问题