Как использовать уникальную версию дочерней зависимости от родителя в Maven - PullRequest
0 голосов
/ 11 декабря 2018

У меня длинный список модулей, получающих свойства из родительского модуля в maven.Я хочу, чтобы один из модулей использовал другую версию Spring от родительского.Другие модули используют более старую версию spring, которая не будет работать с module-c.

Есть ли способ заставить дочерний модуль использовать собственную версию Spring?

// Parent

<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> 

// Child

<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 голосов
/ 11 декабря 2018

Ваш подход с объявлением новой зависимости непосредственно у ребенка pom.xml правильный.Согласно Введение в механизм зависимости :

Посредничество зависимости - это определяет, какая версия артефакта будет выбрана, когда несколько версий будут встречаться как зависимости.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 в classpath вызывает проблемы во время выполнения.Лучше сохранить все Spring JAR-файлы в одной и той же версии во время развертывания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...