Аутентифицированный вызов HEAD из Maven в Artifactory

Я недавно активировал защиту на своем экземпляре Artifactory, что вызвало несколько проблем. Один остается и кажется немного странным:

Maven использует HTTP HEAD, чтобы проверить, был ли развернут новый SNAPSHOT. Однако, когда защита включена, первый вызов выполняется без заголовка аутентификации, что приводит к ответу 401 из Artifactory.

Затем Maven должен выполнить тот же вызов с заголовком аутентификации. Это касается файлов maven-metadata.xml.

Но для файлов.pom и.jar запрос не повторяется, как показано в журнале ниже:

20150303104244|3|REQUEST|xxx.xxx.xxx.xxx|non_authenticated_user|GET|/libs-snapshot-local/mycompany/common/common-config/1.0.4-SNAPSHOT/maven-metadata.xml|HTTP/1.1|401|0
20150303104244|12|REQUEST|xxx.xxx.xxx.xxx|user|GET|/libs-snapshot-local/mycompany/common/common-config/1.0.4-SNAPSHOT/maven-metadata.xml|HTTP/1.1|200|322
20150303104244|40|REQUEST|xxx.xxx.xxx.xxx|user|GET|/libs-snapshot-local/mycompany/common/common-config/1.0.4-SNAPSHOT/maven-metadata.xml.sha1|HTTP/1.1|200|40
20150303104244|4|REQUEST|xxx.xxx.xxx.xxx|user|GET|/libs-snapshot-local/mycompany/common/common-config/1.0.4-SNAPSHOT/maven-metadata.xml.md5|HTTP/1.1|200|32
20150303104245|2|REQUEST|xxx.xxx.xxx.xxx|non_authenticated_user|HEAD|/libs-snapshot-local/mycompany/myproject/myproject-interface/2.0.0-SNAPSHOT/myproject-interface-2.0.0-SNAPSHOT.jar|HTTP/1.1|401|0
20150303104245|2|REQUEST|xxx.xxx.xxx.xxx|non_authenticated_user|HEAD|/libs-snapshot-local/mycompany/myproject/myproject-interface/2.0.0-SNAPSHOT/myproject-interface-2.0.0-SNAPSHOT.jar|HTTP/1.1|401|0

Как объяснено, загрузка файла maven-metadata.xml повторяется с учетными данными пользователя, а myproject-interface-2.0.0-SNAPSHOT.jar - нет.

Я попытался включить предварительную аутентификацию для этого сервера, но не смог найти никаких изменений в поведении Maven:

    <server>
        <id>snapshot</id>
        <username>user</username>
        <password>xxx</password>
        <configuration>
            <httpConfiguration>
                <all>
                    <usePreemptive>true</usePreemptive>
                    <params>
                        <property>
                            <name>http.authentication.preemptive</name>
                            <value>%b,true</value>
                        </property>
                    </params>
                </all>
            </httpConfiguration>
        </configuration>
    </server>

Это касается только обновления существующего SNAPSHOT, поскольку загрузка новых артефактов выполняется с помощью HTTP GET с заголовком аутентификации (по крайней мере, с повторной попыткой). Это по-прежнему препятствует правильному использованию артефактов SNAPSHOT.

Я использую Maven 3.2.1 и Artifactory 3.4.2.

2 ответа

Решение

Это было связано с использованием параметра "Поведение версии снимка Maven" в хранилище снимков Artifactory.

Как объясняется здесь, эта опция больше не поддерживается Maven 3.

Maven 3 поддерживает только уникальные снимки

В Maven 3 прекращена поддержка разрешения и развертывания неуникальных снимков. Поэтому, если у вас есть хранилище моментальных снимков с использованием неуникальных снимков, мы рекомендуем изменить политику снимков Maven на "Уникальные" и удалить все ранее развернутые снимки из этого хранилища. Уникальное имя моментального снимка, сгенерированное клиентом Maven при развертывании, не может помочь в идентификации изменений элемента управления исходным кодом, из которых был создан моментальный снимок, и не имеет отношения к источникам времени, которые были извлечены. Поэтому мы рекомендуем, чтобы сам артефакт встраивал ревизию / тег (как часть его имени или внутри) для четкого и видимого отслеживания ревизии. Artifactory позволяет помечать артефакты номером ревизии в рамках поддержки Build Integration.

Переход на Unique решил эту проблему.

Для всех, кто приземлится здесь в надежде включить превентивную аутентификацию по умолчанию:

Документация для этого параметра на главном сайте Maven неверна. Я потратил некоторое время на его отслеживание, но в конечном итоге нашел ответ в открытом билете с ошибками, который я воспроизвел ниже. Это работало для Maven 3.1.1 на OS X.

<servers>
 <server>
  <id>serverid</id>
  <username>myuser</username>
  <password>mypassword</password>
  <configuration>
   <wagonProvider>httpclient</wagonProvider>
   <httpConfiguration>
    <all>
     <usePreemptive>true</usePreemptive>
    </all>
   </httpConfiguration>
  </configuration>
 </server>
</servers>
Другие вопросы по тегам