当前位置: 首页 > 知识库问答 >
问题:

马文!Spring Boot采用了依赖项目中提到的错误依赖版本

贺浩漫
2023-03-14

我有两个Spring Boot项目,并希望使用其中一个作为MAVEN依赖在其他。

  • 项目刮板取决于数据库项目
  • 项目数据库包含数据库层(实体和DAO在此构建和测试

在数据库项目中,我必须重写Hibernate版本,并按照选项2中https://spring.io/blog/2016/04/13/overriding-dependency-versions-with-spring-boot描述。

<properties>
...
    <hibernate.version>5.2.10.Final</hibernate.version>
</properties>

这很好,我在MAVEN Depdencies中看到了数据库项目的正确版本:/home/pm/。m2/repository/org/hibernate/hibernate-core/5.2.10。最终版本/hibernate-core-5.2.10。最终的罐子

比我来铲运机项目。它不包含Maven依赖项中的任何Hibernate,因为我没有显式导入它们。现在我添加了我的数据库项目依赖项

    <dependency>
        <groupId>web.scraper.database</groupId>
        <artifactId>DataBase</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

这也导入了hibernate,但版本错误(Spring父pom中提到的版本,而不是我的数据库项目hibernate版本)/home/pm/。m2/repository/org/hibernate/hibernate-core/5.0.12。最终版本/hibernate-core-5.0.12。最终的罐子

我想得到Hibernate版本中提到的数据库项目依赖。怎么做这个?

我不想覆盖Scraper项目中的Hibernate版本。

刮刀/聚甲醛。xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>web.scraper.engine</groupId>
    <artifactId>Scraper</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>Scraper</name>
    <description>Web scraper application</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>web.scraper.database</groupId>
            <artifactId>DataBase</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>6.0.6</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

数据库/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>web.scraper.database</groupId>
    <artifactId>DataBase</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>DataBase</name>
    <description>Data base model and DAO</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <!-- Need to set Hibernate version explicitly,
        because java 8 date and time not mapped properly
        with default version -->
        <hibernate.version>5.2.10.Final</hibernate.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <!-- 
            <scope>runtime</scope>
             -->
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- This makes H2 web console available -->
        <!-- 
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <optional>true</optional>
            </dependency>
        -->             

<!-- 
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.1.0.Final</version>
        </dependency>
 -->

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.4.1.Final</version>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

共有2个答案

邹嘉致
2023-03-14

您可以强制正确的版本。在刮板机项目中,从数据库依赖项标记中排除Hibernate依赖项。

<exclusions>
  <exclusion>  
    <groupId>sample.ProjectB</groupId>
    <artifactId>Project-B</artifactId>
  </exclusion>
</exclusions> 

Maven可选依赖和依赖排除

显然,更换样品。用Hibernate信息填充ProjectB。然后,您只需要为您想要的Hibernate版本包含一个单独的依赖项。

我认为有一种更简单的方法可以在你的刮板项目中的数据库依赖中完成这一切,但是我找不到它,我没有太多的时间。

也值得注意/帮助:

  • 强制一个版本
  • 依赖机制简介

编辑:根据我们的评论,尝试将Hibernate从第一个Spring依赖项中排除,这样Spring就无法将其传递给scraper项目。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
  <exclusions>
    <exclusion>  
      <groupId>HIBERNATE-STUFF</groupId>
      <artifactId>HIBERNATE-STUFF</artifactId>
  </exclusion>
</exclusions> 
</dependency>

这将是数据库文件中的Spring依赖项。对所需的Hibernate版本有单独的依赖项。

作为旁注,请旋转一下。它们可以帮助发现来自何处的信息:

mvn dependency:tree -Dverbose 
mvn dependency:tree -Dverbose | grep 'omitted for conflict'
慕容齐智
2023-03-14

为了协调项目之间的依赖关系,应该引入两个项目都从中继承的父pom。父项目本身可以从Spring启动父pom继承。通过属性进行的所有依赖项版本重写都应发生在新的父pom中,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>web.scraper</groupId>
    <artifactId>Parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <name>Parent</name>
    <description>Parent pom to coordinate dependencies</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <!-- Need to set Hibernate version explicitly,
        because java 8 date and time not mapped properly
        with default version -->
        <hibernate.version>5.2.10.Final</hibernate.version>
    </properties>

    <!-- Optionally, you can make this parent define a multi-module project, 
         so that the artifacts can be built together, but you don't have to. -->
    <modules>
        <module>Scraper</module>
        <module>Database</module>
    </modules>
</project>

然后,在Scraper和数据库pom中,像这样声明父级:

<parent>
    <groupId>web.scraper</groupId>
    <artifactId>Parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath/> <!-- lookup parent, or make a multi-module project -->
</parent>

此外,您需要添加的任何非spring管理的新依赖项都可以添加到

在此基础上,mvn dependency:tree | grep hibernate core显示了两个项目中的正确版本:

[INFO] |  +- org.hibernate:hibernate-core:jar:5.2.10.Final:compile

 类似资料:
  • 我有一个类似于 B项目依赖于A项目 项目B的settings.gradle和build.gradle如下所示 格雷德尔酒店 格雷德尔先生 当我尝试在本地机器(Gradle版本3.2)上构建项目B时,它成功构建,一切看起来都很好。 当我尝试在jenkins中构建相同的项目(与我的本地版本相同的gradle版本)时,我得到了错误 它看起来像詹金斯,它是无法计算出相对路径。 我该怎么解决这个问题? 在j

  • 我有一个奇怪的问题,我不知道是什么问题。 我有一个多模块java maven项目,其结构如下: 我在父pom(A)中添加了一个依赖项: 注:除 在模块C和D中,有必要使用版本2.3.0,因此我使用此依赖项重写父pom A的版本1.8.5: 我在模块C和D的pom中添加了这个依赖项。C也是D的依赖项。所以当我尝试构建项目时,我得到以下错误: 因此,maven认为模块C的quartz版本是1.8.5,

  • 这里有几个关于Stackoverflow的问题,关于Kotlin编译器警告,当不同版本的Kotlin JAR在类路径中混合时。 这个问题是一个不同的问题,涉及到使用静态编程语言开发Gradle插件时的情况。当您至少有以下一项: 插件应用 plugin被应用 添加了依赖项 添加了依赖项 你有静态编程语言插件,如,例如: 你会出名的: 静态编程语言1.3.72是Gradle 6.7的嵌入式版本,静态编

  • -->实现'com.firebaseui:firebase-ui-database:1.1.1' 当我添加firebase Ui数据库依赖项时,Gradle显示错误

  • 我在尝试使用“create”创建WebClient实例的线路上收到一个NoClassDefFoundError。尝试了builder(),但仍然是一样的。 请告诉我添加的依赖项有什么问题,以及如何解决这个问题。 我添加的依赖项是 StackTrace:

  • 我找了一段时间如何找出库之间的依赖关系,但我没有找到任何东西。例如。在我的大楼里Gradle是 我如何知道我可以使用什么版本?(例如,com.android.support:support-annotations:25.4.0是否与com.android.support:Appcompat-v7:25.4.0兼容,等等?)有文件记载吗?例如,Android Studio告诉我,我可以使用newer