Как настроить версию maven-site-plugin по умолчанию для всего проекта? [Дубликат]

Привязать событие к родительскому объекту, который уже существует:

$(document).on("click", "selector", function() {
    // Your code here
});
671
задан carlspring 23 February 2017 в 12:35
поделиться

12 ответов

ПРИМЕЧАНИЕ:

Этот ответ относится только к Maven 2! Указанные LATEST и RELEASE метаверсии были отброшены в Maven 3 «ради воспроизводимых построений» более 6 лет назад. Пожалуйста, обратитесь к этому решению Maven 3 .


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

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

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

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

Вот пример, иллюстрирующий различные варианты. В репозитории 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>

Объявить явный 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» вам необходимо активировать " релиз-профиль "из Maven super POM . Вы можете сделать это с помощью «-Prelease-profile» или «-DperformRelease = true»


Следует подчеркнуть, что любой подход, который позволяет Maven выбирать версии зависимостей (ПОСЛЕДНИЙ, РЕЛИЗ и версия диапазоны) могут оставить вас открытыми для создания проблем времени, так как более поздние версии могут иметь другое поведение (например, плагин зависимостей ранее переключил значение по умолчанию от true на false, с запутанными результатами).

Поэтому вообще хорошая идея определить точные версии в выпусках. Как указывает ответ Тима , maven-versions-plugin - удобный инструмент для обновления версий зависимостей, особенно версии : использование последних версий и версии: use-latest-releases .

648
ответ дан Stephan 18 August 2018 в 04:51
поделиться
  • 1
    Привет, Rich! Кажется, маркеры RELEASE и LATEST больше не поддерживаются в Maven 3.x . – Pascal Thivent 31 July 2010 в 08:12
  • 2
    Это отклонение, по-видимому, применимо только к плагинам, а не к нормальным зависимостям, если я правильно понимаю документ – Mond Raymond 19 March 2012 в 22:42
  • 3
    @RichSeller hey Rich; Я потратил немного времени на это, прежде чем я понял, что это больше не доступно в Maven 3.0;) Не могли бы вы отредактировать ответ так, чтобы он начинался с обновления с заявлением о депретации Maven 3.0? Огромное спасибо! – Miquel 29 November 2013 в 17:48
  • 4
    Я считаю, что хорошим балансом будет блокировка основной версии, но последняя версия (или патч) (в зависимости от того, что используется для исправлений ошибок только в артефакте, в котором вы находитесь). С текущим синтаксисом это представляется возможным только с диапазоном (примечание: начинается с скобок и заканчивается с помощью parens): [1.1,2.0) – Amr Mostafa 4 August 2014 в 23:15
  • 5
    FWIW ... обновленная ссылка на Maven3 Примечания по совместимости: cwiki.apache.org/confluence/display/MAVEN/… – dyodji 4 May 2015 в 21:17

В отличие от других, я думаю, есть много причин, по которым вы можете всегда хотеть последнюю версию . В частности, если вы делаете непрерывное развертывание (иногда у нас есть как 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>

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

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

Update

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

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

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

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

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

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

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

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

72
ответ дан Adam Gent 18 August 2018 в 04:51
поделиться
  • 1
    Благодарим за включение в ваш ответ мотивации (непрерывного развертывания). – David J. Liszewski 11 January 2012 в 03:18
  • 2
    Я думаю, что важный момент здесь, который строит, воспроизводится с помощью этого метода, тогда как при использовании диапазонов версий или -LATEST это не так! – marc.guenther 12 July 2012 в 10:09

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

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

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

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

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

<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 в кратчайшие сроки.

0
ответ дан Arayan Singh 18 August 2018 в 04:51
поделиться

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

mvn -U dependency:copy -Dartifact=com.foo:my-foo:LATEST
// pull the latest snapshot for my-foo from all repositories
6
ответ дан erolagnab 18 August 2018 в 04:51
поделиться
  • 1
    даже используя -U, я получаю Couldn't download artifact: Failed to resolve version for com.app:common:jar:LATEST – Robert 14 May 2018 в 17:38

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

5
ответ дан Karl Richter 18 August 2018 в 04:51
поделиться

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

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

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

и добавить плагин версий-maven в ваш файл 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
2
ответ дан Markon 18 August 2018 в 04:51
поделиться

Возможно, вы зависите от версий разработки, которые явно меняются во время разработки?

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

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

14
ответ дан Martin Klinke 18 August 2018 в 04:51
поделиться

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

Элементы зависимостей version определяют требования к версии, используемые для вычисления эффективной версии зависимостей. Требования к версии имеют следующий синтаксис:

  • 1.0: «Мягкое» требование 1.0 (просто рекомендация, если она соответствует всем другим диапазонам для зависимости)
  • [1.0]: «Жесткое» требование на 1.0
  • (,1.0]: x & lt; = 1,0
  • [1.2,1.3]: 1.2 & lt; = x & lt; = 1,3
  • [1.0,2.0): 1,0 & lt; = x & lt; 2.0
  • [1.5,): x> = 1.5
  • (,1.0],[1.2,): x & lt; = 1,0 или x> = 1,2; несколько наборов разделены запятыми
  • (,1.1),(1.1,): это исключает 1.1 (например, если, как известно, не работает в сочетании с этой библиотекой)

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

28
ответ дан mkobit 18 August 2018 в 04:51
поделиться

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

<version>[1.2.3,)</version>

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

162
ответ дан Simon Forsberg 18 August 2018 в 04:51
поделиться
  • 1
    По какой-то причине этот вариант не сработал для меня, он выбрал версию внутри диапазона, но не самую новую. – sorin 12 September 2012 в 15:29
  • 2
    Возможно, вам захочется более внимательно изучить, как Maven сравнивает номера версий - если вы не соответствуете строгим шаблонам, Maven сравнивает их как строки, а не числа. – Thorbjørn Ravn Andersen 25 February 2013 в 15:19
  • 3
    Эта страница находится на Codehaus и описывает себя как вещи ", которые еще не были реализованы для Maven 2.0" ... Документация Maven сама по себе ничего не говорит о диапазонах версий. Я что-то упускаю? Когда были введены диапазоны версий? Где они описаны в официальной документации? – Shannon 1 August 2014 в 22:37
  • 4
    Вы ошибаетесь, диапазон версий означает, что все версии в порядке от 1.2.3 до более высоких. Это совсем не последняя версия. – MariuszS 24 August 2015 в 07:43
  • 5
    @sorin Возможно, у вас есть другие зависимости в вашем проекте, которые также зависят от рассматриваемого артефакта? Попробуйте mvn dependency:tree -Dverbose, чтобы понять это. Это может объяснить неожиданную версию. – Eugene Beresovsky 19 July 2016 в 05:41

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

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

  • версии: use-latest-versions ищет pom для всех версий, которые были более новой версией и заменяли их последней версией.
  • : use-latest-releases ищет pom для всех версий, отличных от SNAPSHOT, которые были более новой версией и заменяли их последней версией версии.
  • : свойства обновления свойств обновляются определенные в проекте, чтобы они соответствовали последней доступной версии конкретных зависимостей.

Также предлагаются следующие цели:

  • версии: display- dependency-updates проверяет зависимости проекта и создает отчет о тех зависимостях, которые имеют более новые версии.
  • версии: display-plugin-updates сканирует плагины проекта и создает отчет о тех плагинах, которые имеют более новые версии .
  • : update-parent обновляет родительский раздел проекта, чтобы он ссылался на новейшую доступную версию. Например, если вы используете корпоративный POM-пользователя, эта цель может быть полезна, если вам нужно убедиться, что вы используете последнюю версию корпоративного корневого POM.
  • версии: update-child-modules обновляет родительский раздел дочерних модулей проекта, чтобы версия соответствовала версии текущего проекта. Например, если у вас есть агрегатор pom, который также является родителем для проектов, которые он агрегирует, а дочерние и родительские версии выходят из синхронизации, это mojo может помочь исправить версии дочерних модулей. (Обратите внимание, что вам может потребоваться вызвать Maven с опцией -N, чтобы выполнить эту задачу, если ваш проект сломан настолько плохо, что он не может построить из-за неправильной сопоставления версии.)
  • : lock- моментальные снимки ищут pom для всех версий -SNAPSHOT и заменяют их текущей версией timestamp этого -SNAPSHOT, например -20090327.172306-4
  • версии: unlock-snapshots выполняет поиск в pom для всех снимков с моментальным снимком с замедленной меткой и заменяет их версиями -SNAPSHOT.
  • : разрешения-диапазоны находят зависимости с использованием диапазонов версий и разрешает диапазон для используемой версии.
  • версии: use-релизы ищет pom для всех версий -SNAPSHOT, которые были выпущены, и заменяет их соответствующей версией выпуска.
  • версии: use-next-releases ищет pom для всех версий, отличных от SNAPSHOT, которые были более новой версией и заменяют их следующей версией.
  • версии: use-next-versions ищет pom для всех версии, которые были более новой версией и заменяли их следующей версией.
  • версии: commit удаляет файлы pom.xml.versionsBackup. Формирует половину встроенного SCM «Бедняка».
  • версии: revert восстанавливает файлы pom.xml из файлов pom.xml.versionsBackup. Создает одну половину встроенного SCM «Бедняка».

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

314
ответ дан Tim 18 August 2018 в 04:51
поделиться
  • 1
    В этом контексте, какая разница между "release" и "версия". – Ben Noland 23 December 2012 в 17:39
  • 2
    @BenNoland, я считаю, что разница в этом случае заключается в том, что следующей версии может не понадобиться артефакт выпуска. Например. с учетом артефакта версии 1.0.0-SNAPSHOT, 1.0.0 и 1.0.1-SNAPSHOT и ссылки pom на версии 1.0.0-SNAPSHOT, версии: следующие версии и версии: следующие выпуски будут разрешены до 1.0.0, тогда как версии: последние версии и версии: последние версии будут относиться к 1.0.1-SNAPSHOT и 1.0.0 с уважением. – Ryan Beesley 17 June 2014 в 20:14
  • 3
    Вы можете устранить некоторые неопределенности между версиями / выпусками / моментальными снимками в этой очень приятной таблице: goo.gl/iDq6PK – Ev0oD 13 October 2014 в 14:13
  • 4
    Это путь Maven, и это гораздо лучше, чем принятый ответ. – Jesse Glick 20 August 2015 в 14:13
  • 5
    Печать всех возможных и несвязанных целей не помогает. – MariuszS 25 August 2015 в 09:53

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

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

Таким образом, вывод заключается в использовании -версий-maven-plugin , если вы можете.

3
ответ дан Verhagen 18 August 2018 в 04:51
поделиться
1
ответ дан yilin 30 October 2018 в 00:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: