Как получить доступ к защищенному 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:
- Добавление Play JSON Library в sbt
- Как добавить конфигурацию профиля среды для SBT
- Как установить размер кучи для sbt?
- Jvm занимает много времени, чтобы решить ip-адрес для localhost
- Как предотвратить java.lang.OutOfMemoryError: пространство PermGen при компиляции Scala?
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?
- Значения символов Build.scala,% и %%
- Настройка sbt для использования Java 7 для компиляции?
- Как запустить основной class sbt из оболочки в качестве обычной командной строки?
- Как установить основной class в сборке?
- Как использовать sbt из-за прокси-сервера?
- Как ссылаться на внешний проект sbt из другого sbt-проекта?
- Запуск пользовательской задачи автоматически до / после стандартной задачи
Вот что я сделал (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:
-
SBT_CREDENTIALS='/home/YOUR_USER_NAME/.ivy2/.credentials' sbt
-
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 неудачных попыток.