2016-06-09 4 views
7

Я использую спецификацию для импорта зависимостей из другого проекта в мой, и мне нужен способ ссылаться на версию зависимости, которая уже заявлена ​​в указанной спецификации. До сих пор я попытался перечислить версию зависимостей как свойство в спецификации, но этот подход завершился неудачей, потому что свойства не импортируются с помощью спецификаций.Есть ли у Maven способ получить версию зависимостей как свойство?

Я видел, где dependency:properties цель Dependency писать софт делает почти именно то, что мне нужно, но вместо того, чтобы дать мне полный путь к артефакту мне нужна версия, как свойство. Есть ли что-то, что может дать мне версию разрешенного артефакта как свойства?

ОБНОВЛЕНИЕ - «Почему бы не использовать родительский pom?»

Я часто ловлю себя на работу в средах серверов приложений, где зависимость, предоставляемая указана с BOM артефактами (как это кажется, что это стало несколько общим/стандартным способом распределения групп взаимосвязанных артефактов, т.е. widlfly) , Поэтому я хочу рассматривать эту спецификацию как единственный источник истины. Идея сделать что-то вроде re-delcaring свойство версии зависимостей, которое уже было определено в спецификации, кажется неправильным.

Если бы я определял свойства родительского помпе, которые отражали среду сервера приложений, теперь мне приходится беспокоиться о сохранении свойств родительского пом и свойств спецификации в синхронизации - почему у вас вообще есть спецификация?

информация уже доступна на дереве зависимостей, это просто вопрос подвергая его ...

+0

Обычный подход - это afaik, чтобы иметь [общего родителя] (http://www.avajava.com/tutorials/lessons/how-do-i-manage-the-version-of-a-dependency-in-a-parent- pom.html) ([Пример IRL] (https://github.com/spring-projects/spring-boot/blob/master/spring-boot-dependencies/pom.xml)), который определяет все версии. – zapl

+0

@zapl - см. Править, я работаю специально с спецификацией. – JoshC13

+0

Почему вы хотите использовать свойство для зависимости, потому что оно определено через спецификацию в dependencyManagement, поэтому вам не нужно определять версию. Зачем вам нужно ссылаться на зависимость? – khmarbaise

ответ

7

Не удалось найти существующие функции maven или plugin для этого, поэтому я разветвил старый модуль dependencypath-maven-plugin и изменил его на использование версий.Теперь я могу упасть в плагине, как это:

<build> 
    . 
    . 
    <plugins> 
     . 
     . 
     <plugin> 
      <groupId>io.reformanda.semper</groupId> 
      <artifactId>dependencyversion-maven-plugin</artifactId> 
      <version>1.0.0</version> 
      <executions> 
       <execution> 
        <id>set-all</id> 
        <goals> 
         <goal>set-version</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

И доступ к свойствам, как это:

идентификатор_группа: артефакт: тип [: классификатор] .version

И.Е.

io.undertow: прибойный-ядро: jar.version = 1.3.15.Final

Отъезд README для получения дополнительной информации о том, как использовать плагин. Это доступно @Maven Central:

<dependency> 
    <groupId>io.reformanda.semper</groupId> 
    <artifactId>dependencyversion-maven-plugin</artifactId> 
    <version>1.0.0</version> 
</dependency> 

... плагины весь путь вниз ...

+0

Только то, что доктор заказал, спасибо! –

3

Короткий ответ - да, вы можете.

В деталях, корневая pom.xml:

<properties> 
    <slf4j.version>1.7.21</slf4j.version> 
</properties> 
... 
<dependencyManagement> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>${slf4j.version}</version> 
    </dependency> 
    ... 
</dependencyManagement> 

В модулях pom.xml:

<dependencies> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
    </dependency> 
    ... 
</dependencies> 

Также вы можете использовать $ {slf4j.version} значение для фильтрации ресурсов или в плагине конфигурации.

Update

В случае, если вы не можете использовать свойства в родительском ПОМ, вы можете либо

  • извлечь все зависимости и их версии с dependency:list плагин; или
  • использовать вместе зависимость: список + antrun: запустить плагин; или
  • настроить сценарии сервера CI, чтобы сделать это для вас (например, с помощью примера this); или
  • написать собственный плагин для обработки логики версий.
+0

Первое предложение вопроса - «Я использую спецификацию для импорта зависимостей». Если бы я использовал родительский pom, это не было бы проблемой. Моя проблема заключается в том, что свойства не импортируются из зависимостей спецификации, но версии этих зависимостей. – JoshC13

+0

Кроме того, этот ответ уже упоминался в нескольких других вопросах S/O относительно того, как делиться свойствами. И.Е. http://stackoverflow.com/questions/1231561/how-to-share-common-properties-among-several-maven-projects – JoshC13

+0

Я обновил ответ. Надеюсь, поможет. – ursa

0

Этот плагин Maven на Github (https://github.com/semper-reformanda/dependencyversion-maven-plugin), и это является обязательным для тех, кто дело с версиями зависимости, например, при использовании зависимостей Webjars - вы можете вводить номера версии Webjar непосредственно в свои веб-ресурсы.

Я искал такую ​​функциональность в течение длительного времени, я надеюсь, что все больше людей приходят через него и что он встает на Maven центральный (я на самом деле думаю, что он должен прийти с Maven из коробки)

+0

См. Мой ответ. Я написал плагин, так как не смог найти эту функцию. Но спасибо за добрые слова ;-) – JoshC13

Смежные вопросы