【发布时间】:2014-05-01 17:50:53
【问题描述】:
我工作的地方使用 Maven,我们有很多内部库。我们尝试以向后兼容的方式进行更改,但有时我们的一个库需要另一个库的更新版本。如果最终产品没有引入更新的库版本,这可能会导致问题。
对于每个最终产品,我们都有一个dependencyManagement 部分,用于声明项目应使用哪些版本的传递依赖项。我们这样做而不是让 Maven 找出要使用的版本,因为我们想要控制正在使用的库的版本。
即使我们让 maven 弄清楚应该使用哪个版本的库,也有可能使用的是旧的库,这可能会导致 ClassNotFoundExceptions 等...
当项目的依赖项之一需要较新版本时,是否有 Maven 插件或方法来确定我的项目是否使用旧版本的依赖项?
有mvn dependency:tree,但我们有很多个依赖项,我不想手动查看庞大的列表。
谢谢!
编辑
由于我们有很多库,如果最终产品使用库 A、B 和 C,并且 A 和 B 都使用不同版本的 C,则并不总是使用最新版本的 C。来自Introduction to the Dependency Mechanism:
依赖中介 - 这决定了依赖的版本 当遇到工件的多个版本时将使用。 目前,Maven 2.0 仅支持使用“最近定义” 这意味着它将使用最接近的依赖版本 你的项目在依赖树中。您始终可以保证 通过在项目的 POM 中明确声明版本。请注意,如果 两个依赖版本在依赖树中的深度相同, 直到 Maven 2.0.8 还没有定义哪一个会赢,但是因为 Maven 2.0.9 重要的是声明中的顺序:第一个 声明获胜。
【问题讨论】:
-
猜我很困惑。你有一个 pom.xml,所以你可以控制你自己的依赖。 Maven 3 有传递依赖,所以如果你使用的东西需要更新的依赖,它会代表你获取它。
-
Maven 3.x 已经发布了很长一段时间(5 年?)...您应该使用它。
-
是的,我正在使用 Maven 3
-
你需要定义你的依赖,而不仅仅是你的依赖管理部分。您要采用的方法听起来是错误的,因为如果您定义了一个库 (A) 版本,它会自动暗示许多传递依赖项(例如 Lib B、Lib C)。 Lib B 和 Lib C 使用 Lib D。因此,如果您更改 D,则必须更改 Lib B 和 Lib C 的 pom 文件中的版本,当然还有 Lib A 的 pom 中的版本。此外,如果您有这样的依赖关系,它可能值得考虑多模块构建而不是单个项目。