Как получить доступ к защищенному Nexus с помощью sbt?

Я пытаюсь получить доступ к менеджеру репозитория Nexus, который требует некоторой базовой проверки подлинности. Все отлично работает с Maven2, но когда я пытаюсь настроить вещи в SBT, он не может найти артефакты. Он использует шаблон пользовательского репозитория (см. Этот связанный вопрос ), но я не думаю, что это имеет значение. В любом случае соответствующая конфигурация здесь.

Project.scala:

val snapshotsName = "Repository Snapshots" val snapshotsUrl = new java.net.URL("http://nexusHostIp:8081/nexus/content/repositories/snapshots") val snapshotsPattern = "[organisation]/[module]/[revision]-SNAPSHOT/[artifact]-[revision](-[timestamp]).[ext]" val snapshots = Resolver.url(snapshotsName, snapshotsUrl)(Patterns(snapshotsPattern)) Credentials(Path.userHome / ".ivy2" / ".credentials", log) val dep = "group" % "artifact" % "0.0.1" extra("timestamp" -> "20101202.195418-3") 

~ / .ivy2 / .credentials:

 realm=Snapshots Nexus host=nexusHostIp:8081 user=nexususername password=nexuspassword 

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

 ==== Repository Snapshots: tried [warn] -- artifact group#artifact;0.0.1!artifact.jar: [warn] http://nexusHostIp:8081/nexus/content/repositories/snapshots/group/artifact/0.0.1-SNAPSHOT/artifact-0.0.1-20101202.195418-3.jar 

Я довольно уверен, что это проблема учетных данных, а не что-то еще, потому что я могу ударить по URL-адресу, в котором говорится, что он пытается напрямую и загрузить банку (после аутентификации).

Я также попробовал объявить учетные данные встроенными (хотя и менее идеальными):

 Credentials.add("Repository Snapshots", "nexusHostIp", "nexususername", "nexuspassword") 

Вот что я сделал (sbt 0.13 + artifactory – настройка должна быть похожа на nexus):

1) Отредактировал файл ~ / .sbt / repositories, как указано здесь: http://www.scala-sbt.org/0.13.0/docs/Detailed-Topics/Proxy-Repositories.html

 [repositories] local my-ivy-proxy-releases: http://repo.company.com/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext] my-maven-proxy-releases: http://repo.company.com/maven-releases/ 

2) Заблокировал мой artifactory, чтобы отключить анонимный доступ.

3) Создал файл учетных данных в ~ / .sbt / .credentials

 realm=Artifactory Realm host=artifactory.mycompany.com user=username password=password 

4) Создал файл под ~ / .sbt / 0.13 / plugins / credentials.sbt, который связывает учетные данные по умолчанию

 credentials += Credentials(Path.userHome / ".sbt" / ".credentials") 

Теперь, когда мой проект загружает sbt, хиты artifactory, как обычно.

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

-Austen

ОБНОВЛЕНИЕ: этот ответ не работает в последних версиях sbt – см. Вместо ответа Austen.

Хорошо, я наконец-то выяснил это.

snapshotsName может быть любым. realm in .credentials должен быть областью аутентификации HTTP, которая появляется при попытке попасть в URL-адрес репозитория (связь в моем случае). realm также является первым параметром Credentials.add . Так что эта линия должна была быть

 Credentials.add("Sonatype Nexus Repository Manager", "nexusHostIp", "nexususername", "nexuspassword") 

Имя хоста – это просто имя IP или DNS. Таким образом, в .credentials host просто nexusHostIp без номера порта.

Таким образом, рабочая конфигурация проекта:

 val snapshotsName = "Repository Snapshots" val snapshotsUrl = new java.net.URL("http://nexusHostIp:8081/nexus/content/repositories/snapshots") val snapshotsPattern = "[organisation]/[module]/[revision]-SNAPSHOT/[artifact]-[revision](-[timestamp]).[ext]" val snapshots = Resolver.url(snapshotsName, snapshotsUrl)(Patterns(snapshotsPattern)) Credentials(Path.userHome / ".ivy2" / ".credentials", log) val dep = "group" % "artifact" % "0.0.1" extra("timestamp" -> "20101202.195418-3") 

Файл .credentials выглядит так:

 realm=Sonatype Nexus Repository Manager host=nexusHostIp user=nexususername password=nexuspassword 

Где «Sonatype Nexus Repository Manager» является областью аутентификации HTTP.

После использования SBT Documetation :

Существует два способа указать учетные данные для такого репозитория:

В очереди

credentials += Credentials("Some Nexus Repository Manager", "my.artifact.repo.net", "admin", "password123")

Внешний файл

 credentials += Credentials(Path.userHome / ".ivy2" / ".credentials") 

Файл учетных данных – это файл свойств с областями ключей, хостом, пользователем и паролем. Например:

 realm=Some Nexus Repository Manager host=my.artifact.repo.net user=admin password=password123 

Если пусковая установка SBT не загружает новую версию SBT из вашего прокси, и что ~/.sbt/boot/update.log показывает, что вы получаете ошибки проверки подлинности 401, вы можете использовать переменную среды SBT_CREDENTIALS, чтобы указать, где плюсовый файл удостоверения личности.

Любой из них должен работать и загружать новую версию sbt:

  1. SBT_CREDENTIALS='/home/YOUR_USER_NAME/.ivy2/.credentials' sbt
  2. export SBT_CREDENTIALS="/home/YOUR_USER_NAME/.ivy2/.credentials" в ваш .bashrc (или .zshrc ), запустите новый сеанс оболочки, а затем запустите sbt

(Вам понадобится установка файла ~/.ivy2/.credentials как показано здесь в других ответах)

Источник: https://github.com/sbt/sbt/commit/96e5a7957c830430f85b6b89d7bbe07824ebfc4b

Это сработало для меня. Я использую версию SBT 0.13.15:

~/.ivy2/.my-credentials (хост без порта):

 realm=Sonatype Nexus Repository Manager host=mynexus.mycompany.com user=my_user password=my_password 

build.sbt (URL-адрес nexus с портом):

 import sbt.Credentials ... credentials += Credentials(Path.userHome / ".ivy2" / ".my-credentials") ... resolvers in ThisBuild ++= Seq( MavenRepository("my-company-nexus", "https://mynexus.mycompany.com:8081/repository/maven-releases/") ) 

Проверьте наличие всех файлов, содержащих учетные данные.

Для меня у меня был новый проект в sbt 1.0 (вместо старого старого 0.13), где у меня был файл ~/.sbt/1.0/global.sbt содержащий мои учетные данные, о котором я забыл. Поэтому после обязательного смены пароля загруженные файлы были повреждены и заблокировали мою учетную запись.

Было бы неплохо, если бы сеть учетных данных и заполняющих их файлов могла быть легко проверена. Было бы также неплохо, если бы SBT был немного более осторожен и сначала проверял правильность аутентификации / авторизации, прежде чем запускать tot загружать X-файлы и блокировать мою учетную запись после 3 неудачных попыток.

  • sbt-assembly: обнаружена ошибка дедупликации
  • Могут ли мультипроекты из GIT использоваться в качестве зависимостей SBT?
  • Как построить Uber JAR (FAT JAR) с использованием SBT в IntelliJ IDEA?
  • как мне получить sbt для использования локального репозитория прокси-сервера maven (Nexus)?
  • Установить sbt на ubuntu
  • Решение проблем зависимостей в Apache Spark
  • Как добавить «предоставленные» зависимости обратно в путь classа run / test tasks?
  • Давайте будем гением компьютера.