Maven зависимости и свойства
Я пытаюсь создать довольно стандартную библиотеку на работе. Он содержит различные стандартные функции поддержки и интерфейсы для сторонних интеграций. Делать вещи здесь, чтобы было легче показать. Во-первых, у меня есть эта структура:
├── pom.xml // parent pom
├── external
│ └── external_system1
│ └── pom.xml // pom for external_system1
├── internal
│ └── internal_system1
│ └── pom.xml // pom for internal_system1
└── util
└── configuration
└── pom.xml // pom for configuration
У нас есть некоторые служебные функции для вызова и подключения к различным системам, а также для регистрации и настройки. В этом есть некоторые внутренние зависимости, например, большинство (если не все) зависят от конфигурации выше.
В первую очередь из-за внутренней зависимости я хочу сохранить все проекты здесь в одной и той же версии. Таким образом, в родительском поме у меня есть версия, и это, конечно, глобально. В конкретных проектах poms у меня есть зависимости от необходимых братьев и сестер. Я попытался заменить строки версии там свойствами, тем же свойством, которое я использую для версии в родительском pom. Однако mvn, похоже, не принимает это, поскольку дает мне:
[ERROR] 'dependencies.dependency.version' for com.mycomapany.myproject:util-configuration:jar must be a valid version but is '${myproject.version}'. @ line 32, column 1
Я могу решить эту проблему, поместив все зависимости в родительский pom, где я могу использовать свойство myproject.version. Это приводит меня к нескольким вопросам:
Разве это не противоречит цели иметь все зависимости в родительском пом? На мой взгляд, имеет большой смысл перечислить их в списке для конкретной части, которая на самом деле имеет зависимость. Мне это помогает с удобочитаемостью, поскольку я легко вижу любые зависимости.
Что происходит, когда я позже что-то собираю, используя эту библиотеку с плагином сборки? Мы создаем отдельные банки и не хотим включать все зависимости, которые не нужны для каждой банки, или она будет просто включать те, которые фактически используются каждой из них? То есть, если у меня есть проект, который зависит от конфигурации утилит, описанной выше, будет ли он тянуть всех братьев и сестер, перечисленных в родительской части утилиты, или он увидит, что там много неиспользованных вещей?
В чем причина этого? Ясно, что то, что я считаю здесь нормальным (размещение зависимостей на самом низком уровне), не считается нормальным. Я пролистал две книги в Sonatype и документацию по pom в Maven, но не смог найти объяснения причин.
В дочерних poms я имею в виду родительский pom по версии. Какой нормальный способ это отразить? Это использовать
mvn versions:set -DnewVersion=
или есть другой способ? И это работает с использованием свойства, или я должен иметь две строки версии для версий: установлен для работы? Один для свойства для самого родительского pom (без переменной) и один для всех зависимостей (устанавливается со свойством, чтобы мне не приходилось менять в 20-ти местах)?
Я понимаю, что пункт 4 выше может быть неясным, но сейчас у меня есть это в родительском пом:
<version>${myproject.version}</version>
...
<dependency>
<groupId>com.mycompany.myproject</groupId>
<artifactId>util-configuration</artifactId>
<version>${myproject.version}</version>
</dependency>
...
<properties>
<myproject.version>0.0.1-SNAPSHOT</myproject.version>
И я пытаюсь спросить, работает ли вышесказанное с versions:set
или если мне нужно изменить сначала строку, а затем, после изменения версии, нужно отредактировать свойство myproject.version.
Извините за очень длинный вопрос (ы), но они чувствуют себя очень связанными.
* edit Добавлен myproject.version
в фрагменте текущего (рабочего) родительского pom, чтобы сделать его немного более понятным с моим свойством, а ниже я добавляю то, что мне хотелось бы (и что имело бы для меня смысл) myproject-internal-somesystem
POM файл с его зависимостью myproject-util-configuration
выглядеть как. То есть используя myproject.version
свойство от родителя, поэтому при изменении версии проекта мне не придется редактировать все отдельные poms и поднять их зависимости. Это не работает, хотя вместо этого я должен иметь зависимость в родительском пом, если я хочу использовать myproject.version
,
<project...
<name>Interaction with internal_system1</name>
<artifactId>myproject-internal-somesystem</artifactId>
<parent>
<groupId>com.mycompany.myproject</groupId>
<artifactId>myproject-root</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>
...
<dependencies>
<dependency>
<groupId>com.mycompany.myproject</groupId>
<artifactId>myproject-util-configuration</artifactId>
<version>${myproject.version}</version>
</dependency>