我正在开发一个基于Spring Boot的库,可以在多个Spring Boot应用程序中使用。该库应该与Spring Boot 1.3.0.M1
一起使用。
我在考虑如何避免在其中放置特定版本的Spring JAR,而是让应用程序指定确切的版本。目前我已经推出了这个解决方案,除了某些组合之外似乎有效:
在库中,将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>
...
在应用程序中,提到实际的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
时,它可以正常工作。
所以,我想知道这是否是处理这种情况的正确方法,或者有更好的方法。
答案 0 :(得分:2)
您正在混合可选的依赖项和依赖项管理。如果您的库需要运行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引导。您可能希望查看并更好地了解依赖关系管理是什么。 This question是一个很好的起点。