Как я могу иметь многомодульный проект Maven без указания версии везде? - PullRequest
0 голосов
/ 24 марта 2019

В настоящее время я изучаю Maven для конкретного проекта.В этом проекте мне нужно иметь несколько модулей (в смысле набора классов и ресурсов), которые зависят друг от друга.В частности, мне нужен модуль для хранения классов общедоступного API (API - это API Java, поскольку программа для настольных компьютеров может загружать надстройки во время выполнения), другой для набора общих классов, которые совместно используются клиентом и сервером.но они не являются частью API, и, конечно же, каждому клиенту и серверу нужен каждый модуль.

Используя систему, которую я использовал до Maven (система сборки IntelliJ Idea), я просто создал бы разные модули иустановить зависимости, используя графический интерфейс IntelliJ.Это хорошо работает, потому что я могу затем поместить весь проект IntelliJ Idea в репозиторий git и хранить все в хорошем состоянии вместе без суеты и проблем.

Однако, исследуя, как это сделать в Maven, я столкнулся с некоторыми проблемами.В документации Maven есть раздел , который, кажется, объясняет, как сделать что-то подобное, но у его техники есть две проблемы.Когда каждому подпроекту с собственным pom.xml необходимо указать версию других подпроектов, от которых он зависит it.Это означает, что мне нужно вносить много изменений по всему проекту, когда меняется версия.Это (надеюсь) будет довольно часто.Поскольку вполне вероятно, что мой проект будет состоять из сотен модулей, это, очевидно, нецелесообразно.

Кроме того, основываясь на моем другом исследовании, похоже, что репозиторий Maven задействован в документированной технике.В частности, похоже, что когда, например, модуль API создается для включения в клиентский и серверный модули, он сначала будет помещен в локальный репозиторий, а затем клиентский и серверный модули извлекут его оттуда.Это звучит проблематично, так как модуль API также будет опубликован в общедоступном репозитории (может быть, Maven central, я на самом деле не слишком много думал об этом - но он будет публичным в репозитории), и этот шаг репозитория, кажется, можетв конечном итоге создайте клиент и сервер с опубликованным jar, а не локальным, что проблематично по многим причинам.(например, если разработчик вносит локальные изменения в api jar, создание половины проекта без этих изменений является проблемой).

Есть ли лучший способ объединить несколько модулей для смягчения этих проблем (версии повсюдуа где баночки получаются неправильно из репо)?Лучше вместо этого изменить технику в связанной документации?Я что-то неправильно понимаю, и проблемы не существуют?

Я проверил DuckDuckGo и все соответствующие вопросы, которые я могу найти в StackOverflow, и ни один из них не решает ни одну из двух вышеупомянутых проблем.

¹:

  <dependencies>
    <dependency>
      <groupId>com.mycompany.app</groupId>
      <artifactId>my-app</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
  </dependencies>

Ответы [ 2 ]

1 голос
/ 24 марта 2019

В вашем многомодульном проекте вы обычно используете только одну версию для всех модулей. Это означает, что вы можете определить зависимости между модулями с <version>${project.version}</version>, где свойство ${project.version}$ разрешается во время сборки. Maven собирает все модули в правильном порядке.

0 голосов
/ 24 марта 2019

Относительно вашего первого вопроса: вы можете создать родительский pom для всего вашего проекта.В этом родительском модуле вы можете добавить раздел dependencyManagement, где вы можете перечислить свои собственные модули с их версией.В ваших модулях вам нужно только указать зависимость без версии.

Вот пример:

в родительском pom:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>yourgroup</groupId>
            <artifactId>yourmoduleA</artifactId>
            <version>3.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>yourgroup</groupId>
            <artifactId>yourmoduleB</artifactId>
            <version>3.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
</dependencyManagement>

, и если ваш модуль A используетмодуль B, вы можете добавить в POM модуля A

     <dependencies>
        <dependency>
            <groupId>yourgroup</groupId>
            <artifactId>yourmoduleB</artifactId>
        </dependency>
    </dependencies>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...