【问题标题】:How to avoid putting a specific version of Spring Boot in a library如何避免将特定版本的 Spring Boot 放入库中
【发布时间】:2015-08-17 03:40:58
【问题描述】:

我正在开发一个基于 Spring Boot 的库,可以在多个 Spring Boot 应用程序中使用。该库应该可以与 Spring Boot 1.3.0.M1 一起使用。

我在考虑如何避免将特定版本的 Spring JAR 放入其中,而是让应用程序指定确切的版本。目前我已经提出了这个解决方案,除了某些组合之外,它似乎可以工作:

  1. 在库中,Spring Boot 版本为1.3.0.M1,所有依赖的范围为provided。像这样:

    ...
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.0.M1</version>
        <relativePath/>
    </parent>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <scope>provided</scope>
        </dependency>
    ...
    
  2. 在应用程序中,提及实际的 Spring Boot 版本,例如1.3.0.M3,并重新包含所有依赖项,如下所示:

    ...
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.0.M3</version>
        <relativePath/>
    </parent>
    
    <dependencies>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
     ...
    

当我使用这个 1.3.0.M1+1.3.0.M3 特定组合运行应用程序时,我收到了这个错误,我认为这只是一些兼容性问题:

Exception in thread "main" java.lang.NoSuchMethodError: org.springframework.core.ResolvableType.forInstance(Ljava/lang/Object;)Lorg/springframework/core/ResolvableType;

但是,尝试稳定版本,例如当我将 lib 版本设置为 1.2.0.RELEASE 并将应用版本设置为 1.2.5.RELEASE 时,它可以工作。

所以,我想知道这是否是处理这种情况的正确方法,还是有更好的方法。

【问题讨论】:

  • 如果你依赖 Spring Boot,那么几乎按照定义它不是一个库。
  • 它的父级为spring-boot-starter-parent,并有一些依赖关系,如spring-boot-starter-web。但是,它没有spring-boot-maven-plugin。因此,生成的是标准 JAR,而不是可执行 JAR。那为什么不能叫它呢?

标签: spring maven spring-boot


【解决方案1】:

您正在混合可选依赖项和依赖项管理。如果您的库需要运行 Spring Boot,那么您必须指定具有默认范围的依赖项。

如果用户什么都不做,只导入你的库,那么他会得到1.3.0.M1,因为这是默认可用的。

如果您现在使用 1.3.0.M3 从 start.spring.io 创建一个项目并将您的库添加到其中,您将看到该项目正在使用 1.3.0.M3。这是因为该项目有一个依赖管理部分,它强制使用 Spring Boot 1.3.0.M3

换句话说,用户必须指定他想使用哪个版本的库;作为库开发人员,无能为力。

关于错误,不可能弄清楚你在做什么,但我最好的猜测是你试图用不兼容的版本覆盖 Spring 框架和 Spring boot。您可能想要查看并更好地了解依赖管理是什么。 This question 是一个很好的起点。

【讨论】:

  • 但是,如果可能的话,我想不要用特定版本的 Spring Boot JAR 来膨胀我的 lib JAR。相反,我想让它变薄,让应用程序包含特定版本的 Spring Boot JAR。
  • 好吧,您当然应该在您的库上运行重新打包目标!您的库应该是标准库,而不是成熟的 Spring Boot 应用程序。
  • 是的,我不是。可能我不够清楚 - 对我的问题进行了一些编辑,现在试图更清楚。
  • 您可能正在覆盖该项目中的其他内容。在应用程序上运行 mvn dependency:list 并确保所有 Spring 框架 jar 都使用 4.2.0.RELEASE。作为记录,该方法是在 4.2.0.RC2 中引入的,因此您可能在应用程序中使用的是旧版本的 Spring Framework(您不应该。Spring Boot 应该为您提供正确的版本)
猜你喜欢
  • 2019-03-19
  • 2016-02-12
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 2018-11-05
  • 1970-01-01
相关资源
最近更新 更多