【问题标题】:maven dependency without version没有版本的maven依赖
【发布时间】:2015-06-11 03:46:55
【问题描述】:

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

<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 是否使用一些默认策略处理版本控制?默认策略是什么?

【问题讨论】:

  • 如果不定义工件的版本,maven 是不可能工作的。它们应该在子模块或父模块中的 dependencyManagement 标记中的某处定义。请检查您的 pom 层次结构。使用 mvn help:effective-pom
  • 你有没有通过mvn help:effective-pom -Doutput=result.xml检查过,看看有没有dependencyManagement。
  • 可以从某个地方传递引用它们吗?这将是最坏的情况,因为您对自己的版本一无所知。

标签: java maven-3 spring-io


【解决方案1】:

如果不定义工件的版本,maven 是不可能工作的。它们应该在子模块或父模块中的dependencyManagement 标记中的某处定义。请检查您的 pom 层次结构。在项目的子模块目录中使用mvn help:effective-pom。您也可以使用mvn dependency:tree 来找出依赖管理的结果中解决了哪些工件以及包括版本号在内的完整工件信息。

【讨论】:

  • maven可以自动拉取最新版本吗?
  • “不可能”是什么意思?是否报告错误?工件是否被静默排除?
【解决方案2】:

好的,我想我会自己回答。当然,我查看了依赖项:树,但我提到的所有依赖项都是树的第一级成员。我没有立即注意到的是,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 Platform,所以这对我来说是一个全新的概念。事实证明,该平台包含相当多的预配置依赖项: http://docs.spring.io/platform/docs/current/reference/htmlsingle/#appendix-dependency-versions

【讨论】:

  • 这与 Spring 无关,而是 maven BOM“材料清单”模式,用于定义使用某些库所需的依赖项。见Maven dependency Mechanism
【解决方案3】:

使用

mvn -P<my_profile_of_interest> help:effective-pom -Dverbose

详细模式(自:3.2.0 起)添加了 XML cmets,其中包含对依赖声明的来源位置的精确引用。

【讨论】:

    【解决方案4】:

    在 pom 中定义的每个 maven 依赖项都必须直接或间接地具有一个版本,例如,通过 dependencyManagement 或 parent。也就是说,如果没有给出版本,那么将使用dependencyManagement或父pom中提供的版本。

    例如:在下面给出的pom(只提到重要部分)中,没有为工件jstl提供任何版本。但是,在“mvn dependency:tree”中,它显示包含 jstl 版本 1.2。并查看 spring-boot-starter-parent,对于版本 2.3.3.RELEASE pom,它包含 jstl 版本 1.2。

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.3.RELEASE</version>
    </parent>
    
    <dependencies>
       ....
       <dependency>
           <groupId>javax.servlet</groupId>
           <artifactId>jstl</artifactId>
       </dependency>
       ....
    </dependencies>
    

    【讨论】:

    • 如果没有依赖管理,会发生什么?
    猜你喜欢
    • 2016-09-18
    • 1970-01-01
    • 2020-07-26
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    相关资源
    最近更新 更多