Как вы эффективно справляетесь со снимками Maven-3 The Timestamped?

StackOverflow https://stackoverflow.com/questions/4275466

  •  28-09-2019
  •  | 
  •  

Вопрос

Теперь, когда Maven-3 сделал Поддержка капли дляu003CuniqueVersion> ложныйu003C/uniqueVersion> Для снимков артефактов кажется, что вам действительно нужно использовать снимки снимки. Особенно M2ECLIPSE, которое использует Maven 3 внутренне, кажется, влияет на нее, Update-Snapshots не работает, когда снимки не являются уникальными.

Это казалось лучшим практиковать раньше Чтобы установить все снимки для UniqueVersion = False

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

Проблема в местных рабочих станциях разработчиков. Их локальный репозиторий быстро растет очень Большой с уникальными снимками.

Как бороться с этой проблемой?

Прямо сейчас я вижу следующие возможные решения:

  • Попросите разработчиков очистить репозиторий в регулярных промежутках (что приводит к большому количеству фустрат, поскольку требуется много времени, чтобы удалить и даже дольше загрузить все необходимое)
  • Установите какой-нибудь скрипт, который удалит все Снимка Справочники от местного хранилища и попросите разработчиков время от времени выполнять этот скрипт (лучше, чем первое, но все же займет довольно время, чтобы запустить и загрузки текущих снимков)
  • Используйте зависимость: плагин для очистки локального репозитария (имеет проблемы при запуске от Eclipse, из-за открытых файлов, необходимо запускать из каждого проекта)
  • Настройте Nexus на каждой рабочей станции и установите работу, чтобы очистить старые снимки (лучший результат, но я не хочу поддерживать 50+ серверов Nexus, плюс память всегда туго на рабочих станциях разработчиков)
  • Хватит использовать снимки вообще

Какой лучший способ сохранить ваш локальный репозиторий от заполнения вашего жесткого диска?

Обновлять:

Чтобы проверить Beaviour и дать больше информации, я настроил небольшой сервер Nexus, построить два проекта (A и B) и попробуйте:

A:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>de.glauche</groupId>
  <artifactId>a</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <distributionManagement>
    <snapshotRepository>
        <id>nexus</id>
        <name>nexus</name>
        <url>http://server:8081/nexus/content/repositories/snapshots</url>
    </snapshotRepository>
  </distributionManagement>

</project>

B:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>de.glauche</groupId>
  <artifactId>b</artifactId>
  <version>0.0.1-SNAPSHOT</version>
    <distributionManagement>
    <snapshotRepository>
        <id>nexus</id>
        <name>nexus</name>
        <url>http://server:8081/nexus/content/repositories/snapshots/</url>
    </snapshotRepository>
  </distributionManagement>
 <repositories>
    <repository>
        <id>nexus</id>
        <name>nexus</name>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        <url>http://server:8081/nexus/content/repositories/snapshots/</url>
    </repository>
 </repositories>
  <dependencies>
    <dependency>
        <groupId>de.glauche</groupId>
        <artifactId>a</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
  </dependencies>
</project>

Теперь, когда я использую Maven и запустить «развернуть» на «A», у меня будет

a-0.0.1-SNAPSHOT.jar
a-0.0.1-20101204.150527-6.jar
a-0.0.1-SNAPSHOT.pom
a-0.0.1-20101204.150527-6.pom

в местном репозитории. С новой версией Timestamp каждый раз, когда я запускаю цель развертывания. То же самое происходит, когда я пытаюсь обновить снимки с сервера Nexus (закрыть «A» проекта, удалите его из локального хранилища, построить «B»)

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

Обновление 2:

Чтобы проверить, как и почему это не удалось, я сделал несколько тестов. Каждый тест бежит против чистого всего (de / glauche получает удаление с обеих машин и nexus)

  • MVN Развертывание с Maven 2.2.1:

Местный репозиторий на машине A содержит Snapshot.jar + Snapshot-Timestamp.jar

Но: только одна временная банка в Nexus, метаданные гласит:

<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <groupId>de.glauche</groupId>
  <artifactId>a</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <versioning>
    <snapshot>
      <timestamp>20101206.200039</timestamp>

      <buildNumber>1</buildNumber>
    </snapshot>
    <lastUpdated>20101206200039</lastUpdated>
  </versioning>
</metadata>
  • Запустить зависимости обновления (на машине b) в M2ECLIPSE (встроенный M3 финал) -> Локальный репозиторий имеет Snapshot.jar + Snapshot-Timestamp.jar :(
  • Запустите пакет со временем Maven 2.2.1 -> Местный хранилище имеет Snapshot.jar + Snapshot-Timestamp.jar :(

ОК, следующая попробуйте с Maven 3.0.1 (после удаления всех следов проекта A)

  • Местный репозиторий на машине A выглядит лучше, только одна невременная банка

  • Только одна временная банка в Nexus, метаданные гласит:

    de.glauche a 0.0.1-Snapshot

    <snapshot>
      <timestamp>20101206.201808</timestamp>
      <buildNumber>3</buildNumber>
    </snapshot>
    <lastUpdated>20101206201808</lastUpdated>
    <snapshotVersions>
      <snapshotVersion>
        <extension>jar</extension>
        <value>0.0.1-20101206.201808-3</value>
        <updated>20101206201808</updated>
      </snapshotVersion>
      <snapshotVersion>
        <extension>pom</extension>
        <value>0.0.1-20101206.201808-3</value>
        <updated>20101206201808</updated>
      </snapshotVersion>
    </snapshotVersions>
    

  • Запустить зависимости обновления (на машине b) в M2ECLIPSE (встроенный M3 финал) -> Локальный репозиторий имеет Snapshot.jar + Snapshot-Timestamp.jar :(

  • Запустите пакет со временем Maven 2.2.1 -> Местный хранилище имеет Snapshot.jar + Snapshot-Timestamp.jar :(

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

Что я делаю неправильно ?

Обновление 3.

Я также провел тестирование различных других конфигураций, сначала замените Nexus с артефактором -> же поведение. Затем используйте клиентов Linux Maven 3 для загрузки снимков из менеджера репозитория -> Локальный репозиторий все еще имеет снимки снимки :(

Это было полезно?

Решение

То <uniqueVersion> Конфигурация, примененная к артефактам, которые были развернуты (через развертывание MVN) к репозиторию Maven, такого как Nexus.

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

Артефакты в местном репозитории на разработчике машина попадают туда из «установки» цели и не используют эти временные метки ... они просто продолжают заменять одну и только версию снимков, если вы также не увеличиваете номер ревизии (например, 1.0,0- Снимок до 1.0.1 - снимок).

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

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

<plugin>         
    <groupId>org.codehaus.mojo</groupId>         
    <artifactId>build-helper-maven-plugin</artifactId>         
    <version>1.7</version>         
    <executions>           
        <execution>             
            <id>remove-old-artifacts</id>             
            <phase>package</phase>             
            <goals>               
                <goal>remove-project-artifact</goal>             
            </goals>            
            <configuration>  
                <removeAll>true</removeAll><!-- When true, remove all built artifacts including all versions. When false, remove all built artifacts of this project version -->             
            </configuration>          
        </execution>         
    </executions>       
</plugin>

Ну, мне не понравилось никаких предложенных решений. Удаление кэша Maven часто значительно увеличивает сетевой трафик и замедляет процесс сборки. Public-Helper-Maven-Plugin помогает только с одним артефактом, я хотел, чтобы решение, которое может очистить все устаревшие артефакты с моментальными снимками из локального кеша в одной простой команде. После нескольких дней поиска я сдался и решил написать небольшую программу. Конечная программа, похоже, работает довольно хорошо в нашей среде. Поэтому я решил поделиться этим с другими, кому может понадобиться такой инструмент. Источники могут быть вытянуты из GitHub: https://github.com/nadestin/tools/tree/master/mavencachecleanup.

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

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

Но у нас были разные проблемы с M2LIPSE. Когда у нас есть включенные «Разрешение рабочей области», и проект существует в нашем рабочем пространстве, исходные обновления обычно держат нас на кровотечении. Но мы нашли, что очень сложно получить M2LIPSE для обновления самого недавно опубликованных артефактов в Nexus. Мы испытываем аналогичные проблемы в нашей команде, и это особенно проблематично, потому что у нас очень большой график проекта ... Есть много зависимостей, которые не будут в вашем рабочем пространстве, но получат публикуемые снимки.

Я уверен, что это кипит обратно к проблеме в M2ECLIPSE, где он не обрабатывает снимки, так как он должен. В консоли Maven вы можете увидеть в Eclipse, где M2Lipse сообщает вам, что он пропускает обновление недавно опубликованного моментального снижения, потому что у него есть кэшированная версия. Если вы сделаете A -U из конфигурации запуска или из командной строки, Мавана подберут изменение метаданных. Но выбор «Обновление снимков ...» должен сказать M2Lipse, чтобы Maven истекает этот кэш. Похоже, это не пропускается вместе. Там, кажется, ошибка там, что подано для этого, если вы заинтересованы в голосовании за это:https://issues.sonatype.org/browse/mngeClipse-2608.

Вы упомянули об этом в комментарии где-то.

Лучший обходной путь для этой проблемы, похоже, имеет разработчики очистить свои местные рабочие станции, когда все начинают разрушаться из M2LIPSE. Подобное решение другой проблемы ... Другие сообщили о проблемах с Maven 2.2.1 и 3 Backing M2Lipse, и я видел то же самое.

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

То есть, если вы не говорите о сервере сборки, который вручную делает mvn install на них. Что касается того, как предотвратить наращивание снимков на окружающей среде, как сервер сборки, мы увернулись к этой пули, имевшая каждую сборку, используйте собственное рабочее пространство и местное хранилище (хотя в Maven 2.2.1, определенные вещи, такие как Помычки, похоже, всегда выходят из ~ / .m2 / хранилища). Дополнительные снимки действительно придерживаются только для одной сборки, а затем они упали (и загружаются снова с нуля). Таким образом, мы видели, как этот подход в конечном итоге поглотите больше места для начала, но он имеет тенденцию оставаться более стабильным, чем у всего, что все разрешено из одного репозитория. Эта опция (на HUDSON) называется «использовать частный репозиторий Maven» и находится под кнопкой расширенной кнопки построения в разделе «Конфигурации проекта», когда вы выбрали, чтобы построить с Maven. Вот описание справки для этого варианта:

Обычно Hudson использует локальный репозиторий Maven, как определено Maven - точный процесс, похоже, недокументирован, но это ~ / .m2 / репозиторий и может быть переопределен в ~ / .m2 / settings.xml (см. Ссылку для более подробной информации ,) Это нормально означает, что все задания, выполненные на одном узле, разделяют один репозиторий Maven. Повышенная часть этого состоит в том, что вы можете сохранить дисковое пространство, но нижняя часть этого состоит в том, что иногда те сборки могут мешать друг другу. Например, вы можете в конечном итоге создавать неправильно добиться успеха, только потому, что у вас есть все зависимости в местном хранилище, несмотря на то, что ни один из репозиторий в POM не может иметь их.

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

Когда эта опция проверяется, HUDSON скажет Maven использовать $ Workspace / .Repository в качестве локального хранилища Maven. Это означает, что каждая работа получит собственную изолированную репозиторий Maven только для себя. Он исправляет вышеуказанные проблемы, за счет дополнительного расхода дискового пространства.

При использовании этой опции рассмотрите возможность настройки Maven Artifact Manager так, чтобы вам не нужно слишком часто ударить репозитории Maven.

Если вы предпочитаете активировать этот режим во всех заданиях Maven, выполненных на HUDSON, обратитесь к описанной здесь методике.

Надеюсь, это поможет - если это не решает вашу проблему, пожалуйста, дайте мне знать, где я пропустил.

В Groovy, Удаление временных файлов, как artifact-0.0.1-20101204.150527-6.jar Может быть очень просто:

root = 'path to your repository'

new File(root).eachFileRecurse {
  if (it.name.matches(/.*\-\d{8}\.\d{6}\-\d+\.[\w\.]+$/)) {
    println 'Deleting ' + it.name
    it.delete()
  }
}

Установить Гроовие, Сохраните сценарий в файл и запланируйте выполнение в каждую неделю, начните, вход в систему, что угодно вам подходит.

Или вы даже можете провести выполнение в сборку Maven, используя gmavenplus-плагин. Отказ Обратите внимание, как находится местопозигородичное местоположение Maven в свойство settings.localRepository а затем священ через конфигурацию в переменной repository:

  <plugin>
    <groupId>org.codehaus.gmavenplus</groupId>
    <artifactId>gmavenplus-plugin</artifactId>
    <version>1.3</version>
    <executions>
      <execution>
        <phase>install</phase>
        <goals>
          <goal>execute</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <properties>
        <property>
          <name>repository</name>
          <value>${settings.localRepository}</value>
        </property>
      </properties>
      <scripts>
        <script><![CDATA[
          new File(repository).eachFileRecurse {
            if (it.name.matches(/.*\-\d{8}\.\d{6}\-\d+\.[\w\.]+$/)) {
              println 'Deleting snapshot ' + it.getAbsolutePath()
              it.delete()
            }
          }
        ]]></script>
      </scripts>
    </configuration>
    <dependencies>
      <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.3.7</version>
        <scope>runtime</scope>
      </dependency>
    </dependencies>
  </plugin>  

Добавьте следующий параметр в свой файл POM

Помна

<configuration>
<outputAbsoluteArtifactFilename>true</outputAbsoluteArtifactFilename>
</configuration>

https://maven.apache.org/plugins/maven-dependency-plugin/copy-mojo.html.

Пример POM.

<plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.10</version>
        <executions>
          <execution>
            <id>copy</id>
            <phase>package</phase>
            <goals>
              <goal>copy</goal>
            </goals>
            <configuration>
              <artifactItems>
                <artifactItem>
                  <groupId>junit</groupId>
                  <artifactId>junit</artifactId>
                  <version>3.8.1</version>
                  <type>jar</type>
                  <overWrite>false</overWrite>
                  <outputDirectory>${project.build.directory}/alternateLocation</outputDirectory>
                  <destFileName>optional-new-name.jar</destFileName>
                </artifactItem>
              </artifactItems>
              **<outputAbsoluteArtifactFilename>true</outputAbsoluteArtifactFilename>**
              <outputDirectory>${project.build.directory}/wars</outputDirectory>
              <overWriteReleases>false</overWriteReleases>
              <overWriteSnapshots>true</overWriteSnapshots>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

Настроить в Дженкинс:

// copy artifact 
copyMavenArtifact(artifact: "commons-collections:commons-collections:3.2.2:jar", outputAbsoluteArtifactFilename: "${pwd()}/target/my-folder/commons-collections.jar")
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top