0

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

PARENT
  |-CHILD1
  |-CHILD2

父项目具有 pom 包装类型,CHILD1并将CHILD2项目声明为模块。项目还PARENT声明了配置文件dev,该配置文件声明了一些属性。CHILD1 项目具有 jar 包装类型,并dev通过添加一些依赖项(commons-collections例如依赖项)来“覆盖”父配置文件。CHILD2 项目具有战争包装类型,并依赖于 CHILD1 项目。dev此外,CHILD2通过添加另一个依赖项(commons-io例如,依赖项,我的意思是与项目 CHILD1 中的那个不相关的依赖项)来“覆盖”父配置文件。然后,当我运行mvn clean install -Pdevmaven 时,不会将commons-collections.jar(在 CHILD1 项目中声明的依赖项)WEB-INF/lib放入 CHILD2 项目,但 commons-io.jar 就在那里。

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

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

4

1 回答 1

2

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

您需要记住的关键是,当工件被部署到本地/远程存储库时,活动配置文件不是部署内容的一部分,因此当您通过配置文件添加依赖项时,事情变得非常危险,因为您没有了解 webapp 是在 DEV 配置文件激活还是 PROD 配置文件激活的情况下构建的方法,然后当构建的工件部署到生产中时,您可能会被彻底搞砸。

因此,不足之处在于您确保您的工件独立于部署环境。

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

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

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

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

您可以通过将 configuration.properties 的测试版本放入src/test/resources.

<scope>provided</scope>您对应用程序的样式依赖项使用相同的原则。换句话说,容器与提供的契约签订的依赖关系应该由容器提供。因此,您也可以使用 Maven 为自己构建 tomcat/jetty 的生产版本,并将所需的依赖项添加到该程序集中。这就像生产版本使用 MySQL 数据库一样,因此您需要将 mysql-jdbc 驱动程序添加到$CATALINA_HOME/lib. 使用组装插件执行此操作相对容易,因为您实际上只是重新打包一个包含一些位而排除其他位的 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>

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

所有这一切的最终结果是工件保持环境独立,您可以轻松地针对各种环境进行测试

希望这能回答你的问题(即使横向)

于 2012-08-14T12:06:38.887 回答