没有版本的maven依赖
maven dependency without version
最近我一直在对前段时间开发的项目进行一些改进,这就是我的发现。 pom 文件中的许多依赖项没有指定版本,但它们已被解析。该项目由 1 个根模块和 2 个子模块组成。使用聚合器模式,这意味着根本没有 dependencyManagement 部分。 upper-project 只是聚合了 2 个模块,仅此而已。子项目不会将其称为 parent。他们有不同的parent。我无法理解的是,子项目本身和它们的 parent(事实上,它也没有 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 dependency:tree
来找出哪些工件以及完整的工件信息(包括版本号)在依赖项管理的结果中得到解决。
好的,我想我会自己回答。当然我看了一下 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
使用
mvn -P<my_profile_of_interest> help:effective-pom -Dverbose
详细模式(自:3.2.0)添加 XML 注释,其中包含对依赖声明来源位置的精确引用。
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>
在我的例子中,如果我使用 Spring boot starter parent 来管理所有依赖项并且 lombok
版本由 Spring boot 管理,这个问题是由于更高的 java version
JAVA 11。我将 JAVA 8 导出到我的编译时环境中,在使用 JAVA 8 之后,这个问题就消失了。
最近我一直在对前段时间开发的项目进行一些改进,这就是我的发现。 pom 文件中的许多依赖项没有指定版本,但它们已被解析。该项目由 1 个根模块和 2 个子模块组成。使用聚合器模式,这意味着根本没有 dependencyManagement 部分。 upper-project 只是聚合了 2 个模块,仅此而已。子项目不会将其称为 parent。他们有不同的parent。我无法理解的是,子项目本身和它们的 parent(事实上,它也没有 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 dependency:tree
来找出哪些工件以及完整的工件信息(包括版本号)在依赖项管理的结果中得到解决。
好的,我想我会自己回答。当然我看了一下 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
使用
mvn -P<my_profile_of_interest> help:effective-pom -Dverbose
详细模式(自:3.2.0)添加 XML 注释,其中包含对依赖声明来源位置的精确引用。
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>
在我的例子中,如果我使用 Spring boot starter parent 来管理所有依赖项并且 lombok
版本由 Spring boot 管理,这个问题是由于更高的 java version
JAVA 11。我将 JAVA 8 导出到我的编译时环境中,在使用 JAVA 8 之后,这个问题就消失了。