Аутентифицированный вызов 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>