Lan*_*Lan 16 dependency-management maven multi-module
在与Maven合作一段时间后,我对Maven为构建体系结构带来的许多功能感到兴奋,特别是依赖管理.但是,我一次又一次遇到一个问题--Maven如何解决多模块项目之间的依赖关系.我想知道这是否是当前Maven实施的一个重大缺陷和/或是否有任何令人满意的解决方法.
假设我有一个多模块Maven项目.Parent pom包含三个模块 - moduleA(jar),moduleB(jar)和moduleC(war).B取决于A和C取决于B.简单吗?现在我想mvn dependency:go-offline
在父项目上运行,该项目应该解析所有依赖项并将它们带入本地.m2目录.它失败了,因为Maven抱怨说当它作用于moduleB时它无法解决moduleA的依赖关系.因为所有这些模块都属于一个groupId,我甚至尝试使用它-DexcludeGroupIds=x.y.z
来排除这些模块依赖关系,但它仍然在同一点上失败.
我理解为什么Maven抱怨 - moduleA还没有构建,因此当执行脱机目标时,我的本地或内部存储库中没有moduleA:jar工件.但IMHO插件应该以不同方式处理这些模块间依赖关系.在这种情况下,它应该简单地忽略它.有人可能会说我可以这样做mvn clean install
,它会将moduleA:jar安装到本地存储库中.在那之后,运行mvn dependency:go-offline
肯定会起作用.但是这种解决方法违背了这个离线目标的目的.这个插件允许我们解析并将依赖项拉入我们的本地存储库,而无需构建整个项目.我dependency:copy-dependencies
在另一个案例中使用了目标,它有同样的问题.
我在其他场景中也遇到了类似的问题:"mvn clean generate-source"无法解决依赖关系.当我运行时mvn clean compile
,一切正常,但是当我运行时mvn clean generate-source
,它失败了,因为Maven无法解决模块间依赖性.在那种情况下,这是由@requiresDependencyResolution
antrun插件引起的.
由于antrun插件和依赖插件在Maven世界中非常流行,我相信我不是唯一遇到过这个问题的人.有人发现任何解决方案/解决方法吗
Fra*_*ans 29
Maven具有"反应器"的概念,其中在单次运行(例如maven package
)中构建的工件可用于在构建期间的依赖性解析.例如,如果您的依赖图生成构建顺序moduleA moduleB moduleC,那么mvn package
Maven将构建moduleA,打包其工件并将其添加到reactor,然后构建moduleB,打包并将其添加到reactor,然后相同对于moduleC.这意味着moduleB可以访问moduleA的工件以进行依赖性解析,而moduleC可以访问moduleA和moduleB.这仅在实际构建工件时才有效,即当您运行包目标时.
问题在于,当您没有运行包目标因为您对工件不感兴趣时(就您的dependency:go-offline
示例而言),已经处理的模块的工件不会构建,因此不会添加到反应器中.我觉得这也很烦人; 我认为Maven应该在其模块列表中查看POM文件以构建并查看它们; 但事实并非如此.
简而言之,解决您的问题的方法就是做mvn package dependency:go-offline
.这不会在本地存储库中安装工件(我认为这是非常糟糕的做法),但它会在构建期间将它们放入反应堆中,这意味着Maven将能够解析从moduleB到具有模块A的模块的依赖关系.已经建成了.缺点是每个模块都将进行测试和打包,当你想做的就是做很多工作dependency:go-offline
.
无论哪种方式,希望这会有所帮助.
Maven Dependency Plugin版本3.1.2最终解决了这个问题。
您可以通过将版本固定在以下位置来确保使用它pom.xml
:
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
Run Code Online (Sandbox Code Playgroud)
Dun*_*nes -1
我怀疑 Maven 能否实现这样的功能。虽然您的项目共享一个共同的父项目并相互依赖,但 Maven 不可能知道在哪里可以找到这些项目来构建它们。它还无法确定项目是否只需要构建,或者您是否为依赖项指定了错误的版本号。
归档时间: |
|
查看次数: |
12640 次 |
最近记录: |