没有版本的 maven 依赖项

2022-08-31 11:38:51

最近,我一直在对前段时间开发的一个项目进行一些改进,这是我的发现。pom 文件中的许多依赖项都没有指定版本,但它们已得到解决。该项目由 1 个根模块和 2 个子模块组成。使用聚合器模式,这意味着根本没有依赖项管理部分。上层项目只是聚合了2个模块,这就是它所做的一切。子项目不将其称为父项目。他们有不同的父母。我无法理解的是,子项目本身及其父项目(事实上,它也没有依赖项管理)都没有为某些依赖项指定版本。例如:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
</dependency>
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
</dependency>
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>imap</artifactId>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jul-to-slf4j</artifactId>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
</dependency>

有人能帮我弄清楚吗?maven 是否使用某种默认策略处理版本控制?默认策略是什么?


答案 1

好吧,我想我要自己回答这个问题。当然,我看了一下 dependency:tree,但我提到的所有依赖项都是树的第一级成员。我没有立即注意到的是,它不存在于父模块中,但它存在于子模块中,并且它包含更有趣的内容:dependencyManagement

        <dependency>
            <groupId>io.spring.platform</groupId>
            <artifactId>platform-bom</artifactId>
            <version>1.0.2.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

我以前从未使用过Spring IO平台,所以这对我来说是一个全新的概念。事实证明,该平台包含相当多的预配置依赖项:http://docs.spring.io/platform/docs/current/reference/htmlsingle/#appendix-dependency-versions


答案 2

如果不定义工件的版本,maven 就不可能工作。它们应该在子模块或父模块的依赖项管理标记中的某个位置定义。请检查您的 pom 层次结构。在项目的子模块目录中使用。此外,还可以使用,以找出在依赖项管理结果中解析了哪些项目以及完整的项目信息(包括版本号)。mvn help:effective-pommvn dependency:tree


推荐