Как мне сказать Maven использовать последнюю версию зависимости?

В Maven зависимости обычно настраиваются следующим образом:

<dependency>
  <groupId>wonderful-inc</groupId>
  <artifactId>dream-library</artifactId>
  <version>1.2.3</version>
</dependency>

Теперь, если вы работаете с библиотеками, у которых есть частые выпуски, постоянно обновляйте тег может немного раздражать. Есть ли способ указать Maven всегда использовать последнюю доступную версию (из репозитория)?

Я действительно не рекомендую эту практику (или использование диапазонов версий) ради воспроизводимости сборки. Сборка, которая внезапно начинает давать сбой по неизвестной причине, намного раздражает больше, чем обновление номера версии вручную.

Pascal Thivent 18.09.2009 02:52

@Martin Мне известно о соглашении xyz-SNAPSHOT, но я думал о библиотеках, которые выпускаются в окончательных версиях в репозиторий (т.е. переход от dream-library-1.2.3.jar к dream-library-1.2.4.jar , и так далее).

Anders Sandvig 27.08.2008 20:50

@PascalThivent Ручное обновление номера выпуска в pom - это боль, если вы делаете непрерывные выпуски. Я использую плагин версий в сочетании с плагином scm, чтобы обойти это (см. Мой ответ).

Adam Gent 10.01.2012 01:24

@PascalThivent Оба раздражают, но по-другому. Я хотел бы выбирать между обоими в зависимости от моей ситуации и не быть вынужденным использовать один, потому что кто-то другой решил, что это будет лучше.

piegames 02.02.2018 23:07

Библиотека guava - хороший пример последней версии, в которой классы удалены из более ранних версий, что затем нарушает сборку. Мышление Maven состоит в том, что любая более новая версия может заменить любую более раннюю, что на практике не выполняется.

Thorbjørn Ravn Andersen 25.11.2020 12:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
824
5
580 032
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

Возможно, вы зависите от разрабатываемых версий, которые, очевидно, сильно меняются в процессе разработки?

Вместо увеличения версии разрабатываемых выпусков вы можете просто использовать версию моментального снимка, которую вы перезаписываете при необходимости, что означает, что вам не придется менять тег версии при каждом незначительном изменении. Что-то вроде 1.0-SNAPSHOT ...

Но, возможно, вы пытаетесь добиться чего-то другого;)

Взгляните на эта страница (раздел «Диапазоны версий зависимостей»). Возможно, вы захотите сделать что-то вроде

<version>[1.2.3,)</version>

Эти диапазоны версий реализованы в Maven2.

Возможно, вы захотите поближе взглянуть на то, как Maven сравнивает номера версий - если вы не соответствуете строгому шаблону, Maven сравнивает как строки, а не числа.

Thorbjørn Ravn Andersen 25.02.2013 17:19

Эта страница находится на Codehaus и описывает себя как вещи, «которые еще не реализованы для Maven 2.0» ... Сама документация Maven ничего не говорит о диапазонах версий. Я что-то пропустил? Когда были представлены диапазоны версий? Где они описаны в официальной документации?

Shannon 02.08.2014 01:37

Вы ошибаетесь, диапазон версий означает, что все версии ОК от 1.2.3 и выше. Это совсем не последняя версия.

MariuszS 24.08.2015 10:43
Ответ принят как подходящий

ПРИМЕЧАНИЕ:

Упомянутые метаверсии LATEST и RELEASEбыли удалены для зависимостей плагинов в Maven 3 "ради воспроизводимых сборок", более 6 лет назад. (Они по-прежнему отлично работают с обычными зависимостями.) Информацию о зависимостях плагинов см. В этом Решение, совместимое с Maven 3.


Если вы всегда хотите использовать самую новую версию, у Maven есть два ключевых слова, которые вы можете использовать в качестве альтернативы диапазонам версий. Вам следует использовать эти параметры с осторожностью, поскольку вы больше не контролируете плагины / зависимости, которые используете.

When you depend on a plugin or a dependency, you can use the a version value of LATEST or RELEASE. LATEST refers to the latest released or snapshot version of a particular artifact, the most recently deployed artifact in a particular repository. RELEASE refers to the last non-snapshot release in the repository. In general, it is not a best practice to design software which depends on a non-specific version of an artifact. If you are developing software, you might want to use RELEASE or LATEST as a convenience so that you don't have to update version numbers when a new release of a third-party library is released. When you release software, you should always make sure that your project depends on specific versions to reduce the chances of your build or your project being affected by a software release not under your control. Use LATEST and RELEASE with caution, if at all.

Подробнее см. Раздел синтаксиса POM книги Maven. Или посмотрите этот документ на Диапазоны версий зависимостей, где:

  • Квадратная скобка ([ и ]) означает «закрытый» (включительно).
  • Скобка (( и )) означает «открытый» (исключительный).

Вот пример, иллюстрирующий различные варианты. В репозитории Maven com.foo:my-foo имеет следующие метаданные:

<?xml version = "1.0" encoding = "UTF-8"?><metadata>
  <groupId>com.foo</groupId>
  <artifactId>my-foo</artifactId>
  <version>2.0.0</version>
  <versioning>
    <release>1.1.1</release>
    <versions>
      <version>1.0</version>
      <version>1.0.1</version>
      <version>1.1</version>
      <version>1.1.1</version>
      <version>2.0.0</version>
    </versions>
    <lastUpdated>20090722140000</lastUpdated>
  </versioning>
</metadata>

Если требуется зависимость от этого артефакта, у вас есть следующие параметры (конечно, можно указать другой диапазоны версий, просто показывая здесь соответствующие):

Объявите точную версию (всегда будет 1.0.1):

<version>[1.0.1]</version>

Объявите явную версию (всегда будет разрешаться до 1.0.1, если не произойдет коллизия, когда Maven выберет подходящую версию):

<version>1.0.1</version>

Объявите диапазон версий для всех 1.x (в настоящее время преобразуется в 1.1.1):

<version>[1.0.0,2.0.0)</version>

Объявить неограниченный диапазон версий (разрешится до 2.0.0):

<version>[1.0.0,)</version>

Объявите версию как ПОСЛЕДНЮЮ (будет разрешено до 2.0.0) (удалено из maven 3.x)

<version>LATEST</version>

Объявите версию как RELEASE (будет разрешено до 1.1.1) (удалено из maven 3.x):

<version>RELEASE</version>

Обратите внимание, что по умолчанию ваши собственные развертывания обновят «последнюю» запись в метаданных Maven, но для обновления записи «release» вам необходимо активировать «release-profile» из Maven super POM. Вы можете сделать это с помощью «-Prelease-profile» или «-DperformRelease = true».


Стоит подчеркнуть, что любой подход, который позволяет Maven выбирать версии зависимостей (LATEST, RELEASE и диапазоны версий), может оставить вас открытыми для проблем со временем сборки, так как более поздние версии могут иметь другое поведение (например, плагин зависимостей ранее переключал значение по умолчанию значение от истины до ложи, с запутанными результатами).

Поэтому обычно рекомендуется определять точные версии в выпусках. Как указывает Ответ тима, плагин версий maven - удобный инструмент для обновления версий зависимостей, особенно целей версии: используйте последние версии и версии: использовать-последние-выпуски.

Я думаю, что ПОСЛЕДНИЙ / РЕЛИЗ очень важен для плагинов, которые обеспечивают функциональность развертывания. Например, мы используем плагин, который развертывает новую версию артефактов на наших серверах. Если серверы изменятся, мы выпускаем новую версию плагина, и все проекты, использующие этот плагин, должны быть обновлены вручную, чтобы использовать новую версию плагина развертывания.

ATom 17.08.2012 18:09

@RichSeller Привет, Рич! Я потратил немного времени на это, прежде чем понял, что это больше не доступно в Maven 3.0;) Не могли бы вы отредактировать ответ, чтобы он начинался с обновления, в котором говорится о депреакции Maven 3.0? Огромное спасибо!

Miquel 29.11.2013 19:48

Я считаю, что хорошим балансом было бы заблокировать основную версию, но получить последнюю второстепенную (или патч) версию (в зависимости от того, что используется для исправления ошибок, только в artifcat, от которого вы зависите). С текущим синтаксисом это возможно только с диапазоном вроде (примечание: начинается с скобок и заканчивается скобками): [1.1,2.0)

Amr Mostafa 05.08.2014 02:15

FWIW ... обновлена ​​ссылка на примечания по совместимости Maven3: cwiki.apache.org/confluence/display/MAVEN/…

dyodji 05.05.2015 00:17

Стоит отметить, что диапазон [1.0.0, 2.0.0] не включает 1.0-SNAPSHOT, но включает 2.0-SNAPSHOT.

splatch 27.01.2017 01:53

Взгляните на конфигурацию плагина enforcer - maven.apache.org/enforcer/enforcer-rules/…

myset 01.07.2019 08:10

Теперь я знаю, что эта тема старая, но, читая вопрос и предоставленный OP ответ, кажется, что Плагин Maven Versions мог бы действительно быть лучшим ответом на его вопрос:

В частности, могут быть полезны следующие цели:

  • версии: используйте последние версии ищет пом для всех версий которые были более новой версией и заменяет их последними версия.
  • версии: использовать-последние-выпуски ищет pom для всех не-SNAPSHOT версии, которые были более новыми освобождает и заменяет их последняя версия выпуска.
  • версии: update-properties обновляет свойства, определенные в проект так, чтобы они соответствовали последняя доступная версия конкретные зависимости. Это может быть полезно, если набор зависимостей все должны быть привязаны к одной версии.

Также предусмотрены следующие другие цели:

  • версии: отображение-зависимости-обновления сканирует зависимости проекта и составляет отчет о тех зависимости, которые имеют более новые доступные версии.
  • версии: дисплей-плагин-обновления сканирует плагины проекта и создает отчет об этих плагинах у которых есть более новые версии.
  • версии: родитель-обновление обновляет родительский раздел проекта, поэтому что он ссылается на новейшие доступная версия. Например, если вы используете корпоративный корневой POM, это цель может быть полезной, если вам нужно убедитесь, что вы используете последнюю версию версия корпоративного root POM.
  • версии: update-child-modules обновляет родительский раздел дочерние модули проекта, поэтому версия соответствует версии текущий проект. Например, если вы иметь помпон-агрегатор, который также родитель для проектов, которые он агрегаты и дети и родительские версии не синхронизируются, это mojo может помочь исправить версии дочерние модули. (Обратите внимание, что вам может потребоваться вызвать Maven с параметром -N в чтобы запустить эту цель, если ваш проект так сильно сломан, что невозможно построить из-за версии несоответствие).
  • версии: блокировки-снимки ищет pom для всех -SNAPSHOT версии и заменяет их на текущая версия с отметкой времени этого -SNAPSHOT, например -20090327.172306-4
  • версии: разблокировка-снимки ищет pom для всех меток времени заблокированные версии снимков и замены их с -SNAPSHOT.
  • версии: диапазоны разрешения находит зависимости, используя диапазоны версий и разрешает диапазон до конкретного используемая версия.
  • версии: использование-релизы ищет pom для всех версий -SNAPSHOT которые были выпущены и заменяют их с соответствующим выпуском версия.
  • версии: использовать-следующие-выпуски ищет pom для всех не-SNAPSHOT версии, которые были более новыми освобождает и заменяет их следующая версия выпуска.
  • версии: используйте-следующие-версии ищет пом для всех версий которые были более новой версией и заменяет их следующей версией.
  • версии: совершить удаляет файлы pom.xml.versionsBackup. Формы половина встроенного "Бедного человека" СКМ ».
  • версии: вернуться восстанавливает файлы pom.xml из pom.xml.versions Резервные файлы. Формы половина встроенного "Бедного человека" СКМ ».

Просто подумал, что включу его для справок в будущем.

В этом контексте, в чем разница между «выпуском» и «версией».

Ben Noland 23.12.2012 19:39

@BenNoland, я считаю, что разница в этом случае в том, что следующая версия может не быть артефактом выпуска. Например. учитывая артефакт с версией 1.0.0-SNAPSHOT, 1.0.0 и 1.0.1-SNAPSHOT, а также ссылку pom на 1.0.0-SNAPSHOT, версии: next-versions и versions: next-Release будут преобразованы в 1.0.0, в то время как версии: latest-versions и versions: latest-релизы будут соответственно преобразованы в 1.0.1-SNAPSHOT и 1.0.0.

Ryan Beesley 17.06.2014 23:14

Распечатка всех возможных и не связанных целей бесполезна.

MariuszS 25.08.2015 12:53

Я ищу то, что будет делать обратное по отношению к версиям: диапазон разрешения. У меня есть pom, который был решен, что я хочу открыть резервную копию до более новых версий (т.е. перейти с 1.2.3-4 на [1.2,).

fmpdmb 25.02.2016 23:23

@fmpdmb Как бы вы могли решить, что это должно быть: <version>[1.2,)</version>, <version>[1.2,2.0)</version> или <version>[1.0,2.0)</version>?

Simon Forsberg 16.03.2016 18:00

@SimonForsberg, может быть, тоже собственность, которую нужно поддерживать?

fmpdmb 20.03.2016 18:51

Можете ли вы попросить плагин версий просматривать зависимости только с определенным groupId, например com.mycompany? Я хочу анализировать только внутренние зависимости для последних версий, так как анализ всего занимает много времени ...

vikingsteve 16.06.2016 16:44

@vikingsteve, если вы используете свойства для внутренних номеров версий, и mvn versions:display-property-updates, он будет работать намного быстрее

Tim 17.06.2016 08:07

Я бы подумал, что версии: use-latest-versions решают большинство проблем OP.

Alex R 31.05.2018 03:07

Но ... работает ли он только для определенной зависимости?

Phate 07.04.2020 22:26

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

Что я делаю, так это заставляю Хадсона / Дженкинса делать следующее для каждой сборки:

mvn clean versions:use-latest-versions scm:checkin deploy -Dmessage = "update versions" -DperformRelease=true

То есть я использую подключаемые модули версий и scm для обновления зависимостей, а затем проверяю их в системе управления версиями. Да, я позволяю своему CI выполнять проверки SCM (что вы все равно должны делать для плагина выпуска maven).

Вы захотите настроить плагин версий, чтобы обновлять только то, что вы хотите:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>versions-maven-plugin</artifactId>
    <version>1.2</version>
    <configuration>
        <includesList>com.snaphop</includesList>
        <generateBackupPoms>false</generateBackupPoms>
        <allowSnapshots>true</allowSnapshots>
    </configuration>
</plugin>

Я использую плагин выпуска для выпуска, который заботится о -SNAPSHOT и проверяет наличие выпускной версии -SNAPSHOT (что важно).

Если вы сделаете то, что я делаю, вы получите последнюю версию для всех сборок моментальных снимков и последнюю версию выпуска для сборок выпуска. Ваши сборки также будут воспроизводимы.

Обновлять

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

Это ошибочно, потому что для запуска плагина версий для настройки версий все существующие версии должны существовать для правильной работы pom. То есть плагин версий не может обновить что-либо до последней версии, если он не может найти версию, указанную в файле pom. На самом деле это довольно неприятно, поскольку мы часто очищаем старые версии из-за недостатка места на диске.

На самом деле вам нужен отдельный инструмент от maven для настройки версий (чтобы вы не зависели от правильной работы файла pom). Я написал такой инструмент на простом языке Bash. Скрипт обновит версии, такие как плагин версии, и вернет pom обратно в систему управления версиями. Он также работает в 100 раз быстрее, чем плагин mvn versions. К сожалению, он не написан для публичного использования, но если людям интересно, я могу сделать это и поместить в gist или github.

Возвращаясь к рабочему процессу, поскольку некоторые комментарии спрашивали о том, что мы делаем:

  1. У нас есть около 20 проектов в их собственных репозиториях с их собственными вакансиями Дженкинса.
  2. Когда мы выпускаем, используется плагин выпуска maven. Рабочий процесс описан в документации к плагину. Плагин выпуска maven отстой (и я добр), но он работает. Когда-нибудь мы планируем заменить этот метод чем-то более оптимальным.
  3. Когда один из проектов будет выпущен, Дженкинс запускает специальное задание, которое мы будем называть обновлением всех версий (откуда Дженкинс знает, что его выпуск - это сложный способ, отчасти потому, что плагин выпуска maven jenkins также довольно дрянный).
  4. Задание по обновлению всех версий знает обо всех 20 проектах. На самом деле это помп-агрегатор, чтобы быть точным со всеми проектами в разделе модулей в порядке зависимости. Дженкинс запускает наш волшебный groovy / bash foo, который вытаскивает все проекты, обновляет версии до последних, а затем проверяет помы (снова выполняется в порядке зависимости на основе раздела модулей).
  5. Для каждого проекта, если pom был изменен (из-за изменения версии в некоторой зависимости), он проверяется, а затем мы немедленно пингуем Дженкинса, чтобы запустить соответствующее задание для этого проекта (это необходимо для сохранения порядка зависимостей сборки, иначе вы находитесь во власти планировщика опроса SCM).

На данный момент я придерживаюсь мнения, что в любом случае хорошо, чтобы выпуск и автоматическая версия были отдельным инструментом от вашей общей сборки.

Теперь вы можете подумать, что maven отстой из-за проблем, перечисленных выше, но на самом деле это было бы довольно сложно с инструментом сборки, который не имеет декларативного синтаксиса, который легко анализировать расширяемый (он же XML).

Фактически, мы добавляем настраиваемые атрибуты XML через пространства имен, чтобы помочь нам подсказывать сценарии bash / groovy (например, не обновляйте эту версию).

Спасибо, что включили в свой ответ мотивацию (непрерывное развертывание).

David J. Liszewski 11.01.2012 05:18

Я думаю, что важным моментом здесь является то, что сборки можно воспроизводить с помощью этого метода, тогда как при использовании диапазонов версий или -LATEST это не так!

marc.guenther 12.07.2012 13:09

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

Daniel Hajduk 08.01.2020 11:03

К тому времени, когда этот вопрос был задан, в maven были некоторые проблемы с диапазонами версий, но они были устранены в более новых версиях maven. Эта статья очень хорошо описывает, как работают диапазоны версий, и передовые практики, чтобы лучше понять, как maven понимает версии: https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855

Хотя теоретически это может дать ответ на вопрос, было бы предпочтительнее включает сюда основные части ответа и предоставляет ссылку для справки.

Karl Richter 31.05.2017 22:13

Правда в том, что даже в 3.x он все еще работает, на удивление проекты строятся и разворачиваются. Но ключевое слово LATEST / RELEASE вызывает проблемы в m2e и eclipse повсюду, ТАКЖЕ проекты зависят от зависимости, которая развернута через LATEST / RELEASE, не может распознать версию.

Это также вызовет проблему, если вы попытаетесь определить версию как свойство и ссылаться на нее в другом месте.

Итак, вывод - используйте версии-maven-plugin, если можете.

Синтаксис зависимостей находится в документации Спецификация требований к версии зависимостей. Вот он для полноты:

Dependencies' version element define version requirements, used to compute effective dependency version. Version requirements have the following syntax:

  • 1.0: "Soft" requirement on 1.0 (just a recommendation, if it matches all other ranges for the dependency)
  • [1.0]: "Hard" requirement on 1.0
  • (,1.0]: x <= 1.0
  • [1.2,1.3]: 1.2 <= x <= 1.3
  • [1.0,2.0): 1.0 <= x < 2.0
  • [1.5,): x >= 1.5
  • (,1.0],[1.2,): x <= 1.0 or x >= 1.2; multiple sets are comma-separated
  • (,1.1),(1.1,): this excludes 1.1 (for example if it is known not to work in combination with this library)

В вашем случае вы могли бы сделать что-то вроде <version>[1.2.3,)</version>

Кто когда-либо использовал ПОСЛЕДНИЕ, убедитесь, что у вас есть -U, иначе последний снимок не будет извлечен.

mvn -U dependency:copy -Dartifact=com.foo:my-foo:LATEST
// pull the latest snapshot for my-foo from all repositories

Это не извлекает последний снимок из локального репозитория m2

c.sankhala 12.02.2021 12:42

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

Один из способов обхода - использовать версии-maven-plugin. Например, вы можете объявить свойство:

<properties>
    <myname.version>1.1.1</myname.version>
</properties>

и добавьте плагин versions-maven-plugin в свой файл pom:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>versions-maven-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <properties>
                    <property>
                        <name>myname.version</name>
                        <dependencies>
                            <dependency>
                                <groupId>group-id</groupId>
                                <artifactId>artifact-id</artifactId>
                                <version>latest</version>
                            </dependency>
                        </dependencies>
                    </property>
                </properties>
            </configuration>
        </plugin>
    </plugins>
</build>

Затем, чтобы обновить зависимость, вам необходимо выполнить цели:

mvn versions:update-properties validate

Если есть версия новее 1.1.1, он сообщит вам:

[INFO] Updated ${myname.version} from 1.1.1 to 1.3.2

Если вы хотите, чтобы Maven использовал последнюю версию зависимости, тогда вы можете использовать Плагин Versions Maven, и как использовать этот плагин, Тим уже дал хороший ответ, следуйте его отвечать.

Но как разработчик я не буду рекомендовать такой подход. ПОЧЕМУ?

ответ на почему уже дан Паскаль Тивент в комментарии к вопросу

I really don't recommend this practice (nor using version ranges) for the sake of build reproducibility. A build that starts to suddenly fail for an unknown reason is way more annoying than updating manually a version number.

Я рекомендую такой вид практики:

<properties>
    <spring.version>3.1.2.RELEASE</spring.version>
</properties>

<dependencies>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

</dependencies>

его легко поддерживать и легко отлаживать. Вы можете обновить свой POM в кратчайшие сроки.

если вы используете модули-версии-maven-plugin, сборка все еще воспроизводима. Обновление версии maven может быть выполнено в отдельном коммите (как вы можете видеть из моего ответа, вам нужно указать отдельную цель, это просто не происходит волшебным образом в сборке).

Markon 08.08.2019 17:36

Мое решение в maven 3.5.4, используйте nexus, в eclipse:

<dependency>
    <groupId>yilin.sheng</groupId>
    <artifactId>webspherecore</artifactId>
    <version>LATEST</version> 
</dependency>

затем в eclipse: atl + F5 и выберите force update of snapshots/release

меня устраивает.

Не работает в командной строке, хотя по причинам, умело указанным выше в различных сообщениях. Многие из нас должны соответствовать автоматизированным сборкам, поэтому наши POM должны работать при запуске из командной строки, а не только в Eclipse.

bigbadmouse 16.10.2018 13:45

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