【发布时间】:2012-08-13 19:06:52
【问题描述】:
我有一个多模块 Maven 项目。项目布局描述如下:
PARENT
|-CHILD1
|-CHILD2
父项目具有 pom 打包类型,并将 CHILD1 和 CHILD2 项目声明为模块。 PARENT 项目还声明了配置文件 dev,它声明了一些属性。
CHILD1 项目具有 jar 包装类型,并通过添加一些依赖项(例如对 commons-collections 的依赖项)“覆盖”PARENT dev 配置文件。
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 中声明项目特定的依赖项(假设在项目中声明配置文件将“覆盖”父配置文件声明)
【问题讨论】:
-
使用配置文件添加依赖项是主要的反模式,在原始 POM 格式规范中不应被允许。
-
在不同profile需要不同依赖的情况下如何操作?我需要在一些配置文件中排除一些依赖项
-
使用不同的模块和 webapp 覆盖通过配置文件将模块添加到反应器中。 IOW 您将拥有三个或四个 webapp 模块,除了一个之外,所有模块都是“空的”,仅依赖于基础 webapp 和您需要的其他依赖项
-
您需要记住,当工件被部署到存储库时,您会丢失活动的配置文件信息,因此从存储库中拉取依赖项的消费者不会拉取通过profile (除非他们碰巧有一个同名的 profile 处于活动状态)所以你真的需要单独的工件来拥有单独的依赖关系
-
所以,我必须为每个配置文件创建一个项目,我的意思是如果一个模块的依赖项在配置文件中有所不同,我必须创建该模块的子模块并向该模块添加特定的依赖项(没有源的模块和资源,仅声明依赖项)并在模块中仅声明公共依赖项?