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

Pav*_*vlo 5 java spring maven spring-boot

我有两个 Spring Boot 项目,并且想将其中一个用作另一个中的 MAVEN 依赖项。

  • 项目爬虫依赖于数据库项目
  • 项目数据库包含数据库层(实体和 DAO 在这里构建和测试)

在数据库项目中,我必须覆盖 Hibernate 版本,并像https://spring.io/blog/2016/04/13/overriding-dependency-versions-with-spring-boot选项 2 中描述的那样。

<properties>
...
    <hibernate.version>5.2.10.Final</hibernate.version>
</properties>
Run Code Online (Sandbox Code Playgroud)

这工作正常,我在 MAVEN 依赖项中看到数据库项目的正确版本:/home/pm/.m2/repository/org/hibernate/hibernate-core/5.2.10.Final/hibernate-core-5.2.10.Final.jar

比我来的 Scraper 项目。它在 Maven 依赖项中不包含任何 Hibernate,因为我没有明确导入它们。现在我添加我的数据库项目依赖项

    <dependency>
        <groupId>web.scraper.database</groupId>
        <artifactId>DataBase</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

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

我想获得数据库项目依赖中提到的休眠版本。何做这个?

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

刮板/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.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>
Run Code Online (Sandbox Code Playgroud)

数据库/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>
Run Code Online (Sandbox Code Playgroud)

小智 3

为了协调项目之间的依赖关系,您应该引入两个项目都继承自的父pom。父项目本身可以继承Spring Boot父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>
Run Code Online (Sandbox Code Playgroud)

然后,在您的 Scraper 和 Database poms 中,像这样声明父级:

<parent>
    <groupId>web.scraper</groupId>
    <artifactId>Parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath/> <!-- lookup parent, or make a multi-module project -->
</parent>
Run Code Online (Sandbox Code Playgroud)

此外,您需要添加的任何不受 spring 管理的新依赖项都可以添加到<dependencyManagement>父 pom 的部分,以便您的其他 pom 永远不必声明版本。

完成此操作后,mvn dependency:tree | grep hibernate-core将显示两个项目中的正确版本:

[INFO] |  +- org.hibernate:hibernate-core:jar:5.2.10.Final:compile
Run Code Online (Sandbox Code Playgroud)