Java с Maven: как сделать модуль B зависимым от jar модуля A? - PullRequest
2 голосов
/ 22 мая 2019

Контекст:

Вопрос касается мультимодульного (maven, а не Java 9) проекта Java, использующего maven для его сборки, где один модуль зависит от jar другогоmodule.

Обзор модулей и некоторый контекст:

  • A: библиотека, скомпилированная в jar.
  • B: клиентское приложение, которое зависит от jar A ;скомпилирован в исполняемый jar.
  • C: серверное приложение, не зависящее от A или B ;скомпилирован в исполняемый файл.
  • Я могу использовать только Java 8 и, следовательно, не использовать модули Java 9.
  • Используется IDE IntelliJ IDEA Ultimate.

Что работает:

  • Сборка модулей в трех отдельных банках (исполняемых в случае B и C ) с использованием mvn clean package.
  • Импорт пакетов из модуля A в классы модуля B ( не то, что я хочу ).
  • Добавление зависимости к модулю A в файл pom.xml B (я не знаю, как это повлияет ...).

Чего я хотел бы достичь:

  • Я хотел бы добавить зависимость к банке построен из модуля A в pom.xml модуля B .
  • Я хотел бы импортировать публичные классы и интерфейсы из jar модуля A в классах модуля B (добавив его в качестве зависимости в pom.xml и не копируя банку вручную).-> Разработка и отладка B должны зависеть только от последней стабильной сборки A и не должны прерываться при одновременной разработке в библиотеке A .
  • Весь процесс сборки должен быть завершен путем выполнения одного сценария Bash (один раз).
  • Для сборки проекта необходимо выполнить следующие шаги в следующем порядке:
    1. Модуль сборки A на банку (если это неизбежно, также сборка B ).
    2. Сборка (или перестройка) модуля B с использованием баночки, созданной на шаге 1к исполняемому банку.
    3. Модуль сборки C в любое время в процессе сборки.

Есть ли для этого элегантное решение с использованием maven?

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

Начиная с Maven 3.5.0-beta, есть поле revision, используемое для управления многомодульными проектами.

https://maven.apache.org/maven-ci-friendly.html

Тебе нужен родитель pom.xml, чтобы выглядеть как

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
  </parent>
  <groupId>...</groupId>
  <artifactId>...</artifactId>
  <version>${revision}</version>
  ...

  <properties>
    <revision>1.0.0-SNAPSHOT</revision>
  </properties>
</project> 

И тогда ваш подмодуль A (ребенок) будет выглядеть как

<project>
  <modelVersion>...</modelVersion>
  <parent>
    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <!-- Make sure you have maven 3.6.0 at least for this to work -->
    <version>${revision}</version> 
  </parent>
  <groupId>...</groupId>
  <artifactId>...</artifactId>
  <!-- Don't put version, it's taken from the parent -->
  ...
</project>

И, наконец, ваш модуль B выглядит следующим образом

<project>
  <modelVersion>...</modelVersion>
  <parent>
    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>${revision}</version> 
  </parent>
  <groupId>...</groupId>
  <artifactId>...</artifactId>
  ...
  <dependency>
    <groupId>...</groupId>
    <artifactId>module-A</artifactId>
    <version>${project.version}</version>
  </dependency>
  ...
</project>

Ваш модуль C, скорее всего, будет выглядеть как модуль A, но без каких-либо зависимостей

Это должно заставить ваш пом работать локально. Если вам нужно развернуть их, вам также нужно добавить плагин flatten, который возьмет ваш pom.xml и заменит переменные revision на актуальную версию вашего проекта.

 <build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>flatten-maven-plugin</artifactId>
      <version>1.1.0</version>
      <configuration>
        <updatePomFile>true</updatePomFile>
        <flattenMode>resolveCiFriendliesOnly</flattenMode>
      </configuration>
      <executions>
        <execution>
          <id>flatten</id>
          <phase>process-resources</phase>
          <goals>
            <goal>flatten</goal>
          </goals>
        </execution>
        <execution>
          <id>flatten.clean</id>
          <phase>clean</phase>
          <goals>
            <goal>clean</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
  </build>

Вы также должны иметь возможность создавать свои проекты независимо, используя mvn clean package -pl module-A, хотя я бы порекомендовал вам строить A и B одновременно, по крайней мере.

1 голос
/ 22 мая 2019

В Maven у вас обычно есть два варианта:

  1. Определите три проекта A, B и C.
  2. Определите один многомодульный проект, содержащий A, B и C в качестве модулей.

В любом случае вы описываете зависимости, используя зависимости Maven в pom.xml.

Многомодульные проекты обычно создаются за один раз, поэтому компилируем весь код и используем один и тот же номер версии для всех трех модулей. Это нарушило бы вашу идею «сборки против последней стабильной версии», поскольку при сборке вы всегда зависите от самой новой версии A.

Если вы определили три разных проекта, у вас нет этих ограничений (и C в любом случае кажется независимым). Остаются две проблемы: вам нужно обновить версию A в зависимости - что можно сделать с помощью плагина версий. И вы хотите построить «сборку в один клик». Самым простым подходом, вероятно, будет конвейер в Jenkins (или каков ваш сервер сборки), но вы также можете написать сценарий оболочки, который трижды вызывает Maven.

...