我有一个多模块maven项目。项目布局如下所述:
PARENT
|-CHILD1
|-CHILD2
父项目具有pom打包类型,并将CHILD1
和CHILD2
项目声明为模块。此外,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中声明项目特定的依赖项(假设在项目中声明配置文件将"覆盖"父配置文件声明)
答案 0 :(得分:2)
我假设您希望能够在开发时在本地进行测试,针对暂存环境测试您的更改,最后部署到生产环境。
您需要记住的关键事项是,当工件部署到本地/远程存储库时,活动配置文件不是部署的部分,因此当您通过配置文件添加依赖项时,事情变得非常危险你无法知道webapp是在DEV配置文件处于活动状态还是PROD配置文件处于活动状态的情况下构建的,然后当这个构建的工件部署到生产环境中时,你可能会被搞砸了。
所以缺点是你确保你的工件独立于部署环境。
这意味着,例如,您将从以下位置获取配置:
例如,如果部署到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:run
和tomcat: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>
您还可以配置系统属性或类路径添加以提取所需的配置文件。
所有这些的最终结果是工件保持与环境无关,您可以轻松地针对各种环境进行测试
希望这能回答你的问题(即使是侧身)