如何在Maven中使用来自父项的唯一子项依赖项版本

时间:2018-12-11 14:40:35

标签: java maven

我有一堆从maven的父模块获取属性的模块。我希望其中一个模块使用与父代不同的spring版本。其他模块使用的是Spring的旧版本,无法与Module-c一起使用。

有没有办法使子模块使用自己的spring版本?

//父母
    

<groupId>xxx.xx.com</groupId>
   <artifactId>test-environment</artifactId>
   <version>1.0.0</version>
   <packaging>pom</packaging>
   <name>test-environment</name>

  <properties>
       <spring.version>4.0.6.RELEASE</spring.version>
  </properties>

    <modules>
     <module>module-a</module>
     <module>module-b</module>
     <module>module-c</module>
    </modules>
</project> 

//孩子

<project>

<parent>
    <groupId>xxx.xx.com</groupId>
    <artifactId>test-environment</artifactId>
    <version>1.0.0</version>
</parent>

<artifactId>module-c</artifactId>
<packaging>war</packaging>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.0.RELEASE</version>
    </dependency>
  </dependencies>
</project>

//错误

java.lang.NoSuchMethodError: org.springframework.core.ResolvableType.forInstance(Ljava/lang/Object;)Lorg/springframework/core/ResolvableType;
    at org.springframework.context.event.SimpleApplicationEventMulticaster.resolveDefaultEventType(SimpleApplicationEventMulticaster.java:144)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:121)
    at org.springframework.boot.context.event.EventPublishingRunListener.publishEvent(EventPublishingRunListener.java:111)
    at org.springframework.boot.context.event.EventPublishingRunListener.started(EventPublishingRunListener.java:60)
    at org.springframework.boot.SpringApplicationRunListeners.started(SpringApplicationRunListeners.java:48)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
    at org.springframework.boot.context.web.SpringBootServletInitializer.run(SpringBootServletInitializer.java:149)

1 个答案:

答案 0 :(得分:0)

您直接在子pom.xml中声明较新依赖项的方法是正确的。根据{{​​3}}:

  

依赖关系中介-确定遇到多个版本作为依赖项时,将选择工件的哪个版本。 Maven选择了“最近的定义”。也就是说,它使用依赖关系树中最接近您的项目的版本。您始终可以通过在项目的POM中明确声明版本来保证版本。

您很可能需要添加spring-core所依赖的spring-context,以拥有org.springframework.core.ResolvableType类的正确版本并避免使用NoSuchMethodError

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.3.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.0.RELEASE</version>
</dependency>

在类路径中使用多个版本的Spring运行要求运行时问题。最好在运行时部署中将所有Spring JAR保持相同的版本。