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. Это приводит меня к нескольким вопросам:

  1. Разве это не противоречит цели иметь все зависимости в родительском пом? На мой взгляд, имеет большой смысл перечислить их в списке для конкретной части, которая на самом деле имеет зависимость. Мне это помогает с удобочитаемостью, поскольку я легко вижу любые зависимости.

  2. Что происходит, когда я позже что-то собираю, используя эту библиотеку с плагином сборки? Мы создаем отдельные банки и не хотим включать все зависимости, которые не нужны для каждой банки, или она будет просто включать те, которые фактически используются каждой из них? То есть, если у меня есть проект, который зависит от конфигурации утилит, описанной выше, будет ли он тянуть всех братьев и сестер, перечисленных в родительской части утилиты, или он увидит, что там много неиспользованных вещей?

  3. В чем причина этого? Ясно, что то, что я считаю здесь нормальным (размещение зависимостей на самом низком уровне), не считается нормальным. Я пролистал две книги в Sonatype и документацию по pom в Maven, но не смог найти объяснения причин.

  4. В дочерних 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>

0 ответов

Другие вопросы по тегам