J'essaie d'accéder à un gestionnaire de référentiel Nexus qui nécessite une authentification de base. Tout fonctionne bien depuis Maven2, mais lorsque j'essaie de configurer les choses dans SBT, il ne trouve pas les artefacts. Il utilise un modèle de référentiel personnalisé (voir cette question connexe ) mais je ne pense pas que cela devrait avoir d'importance. Dans tous les cas, la configuration appropriée est ici.
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
Selon ne discussion similaire dans le groupe d'utilisateurs SBT cela devrait fonctionner correctement mais j'obtiens ce qui suit lorsque j'essaye de construire.
==== 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
Je suis à peu près certain que c'est un problème d'informations d'identification et pas autre chose car je peux frapper l'URL, il dit qu'il essaie directement et télécharger le pot (après l'authentification).
J'ai également essayé de déclarer les informations d'identification en ligne (même si ce n'est pas idéal) comme ceci:
Credentials.add("Repository Snapshots", "nexusHostIp", "nexususername", "nexuspassword")
Voici ce que j'ai fait (sbt 0.13 + artifactory - la configuration devrait être similaire pour nexus):
1) Édité le fichier ~/.sbt/repositories comme spécifié ici: 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) Verrouillé mon artificiel pour désactiver l'accès anonyme.
3) Création d'un fichier d'informations d'identification dans ~/.sbt/.credentials
realm=Artifactory Realm
Host=artifactory.mycompany.com
user=username
password=password
4) Création d'un fichier sous ~/.sbt/0.13/plugins/credentials.sbt qui relie les informations d'identification par défaut
credentials += Credentials(Path.userHome / ".sbt" / ".credentials")
Maintenant, lorsque mon projet se charge, sbt atteint un artificiel comme d'habitude.
La raison pour laquelle je l'ai fait de cette façon est de garder les définitions du référentiel, etc., hors des fichiers de projet pour permettre aux équipes d'avoir de la flexibilité (elles peuvent configurer un serveur interne pour servir les artefacts en cours, etc.).
-Austen
MISE À JOUR: Cette réponse ne fonctionne pas dans les versions récentes de sbt - voir plutôt la réponse d'Austen.
D'accord, j'ai finalement réussi à régler ce problème.
snapshotsName
peut être n'importe quoi. realm
in .credentials doit être le domaine d'authentification HTTP qui s'affiche lorsque vous essayez d'appuyer sur l'URL du référentiel (nexus dans mon cas). realm
est également le premier paramètre de Credentials.add
. Donc, cette ligne aurait dû être
Credentials.add("Sonatype Nexus Repository Manager", "nexusHostIp", "nexususername", "nexuspassword")
Le nom d'hôte est simplement le nom IP ou DNS. Donc dans .credentials Host
est juste nexusHostIp
sans le numéro de port.
La configuration de travail du projet est donc:
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")
Avec un fichier .credentials qui ressemble à:
realm=Sonatype Nexus Repository Manager
Host=nexusHostIp
user=nexususername
password=nexuspassword
Où "Sonatype Nexus Repository Manager" est le domaine d'authentification HTTP.
Si le lanceur SBT ne parvient pas à télécharger une nouvelle version de SBT à partir de votre proxy, et que ~/.sbt/boot/update.log
indique que vous obtenez des erreurs d'authentification 401, vous pouvez utiliser la variable d'environnement SBT_CREDENTIALS pour spécifier l'emplacement du fichier d'informations d'identification ivy.
L'un ou l'autre devrait fonctionner et télécharger la nouvelle version de sbt:
SBT_CREDENTIALS='/home/YOUR_USER_NAME/.ivy2/.credentials' sbt
export SBT_CREDENTIALS="/home/YOUR_USER_NAME/.ivy2/.credentials"
dans ton .bashrc
(ou .zshrc
), démarrez une nouvelle session Shell, puis exécutez sbt
(Vous aurez besoin du ~/.ivy2/.credentials
configuration du fichier comme d'autres réponses ici ont montré)
Source: https://github.com/sbt/sbt/commit/96e5a7957c830430f85b6b89d7bbe07824ebfc4b
Après la SBT Documetation :
Il existe deux façons de spécifier les informations d'identification pour un tel référentiel:
credentials += Credentials("Some Nexus Repository Manager", "my.artifact.repo.net", "admin", "password123")
credentials += Credentials(Path.userHome / ".ivy2" / ".credentials")
Le fichier d'informations d'identification est un fichier de propriétés avec le domaine des clés, l'hôte, l'utilisateur et le mot de passe. Par exemple:
realm=Some Nexus Repository Manager
Host=my.artifact.repo.net
user=admin
password=password123
Cela a fonctionné pour moi. J'utilise la version 0.13.15 de SBT:
~/.ivy2/.my-credentials
(Hôte sans port):
realm=Sonatype Nexus Repository Manager
Host=mynexus.mycompany.com
user=my_user
password=my_password
build.sbt
(URL nexus avec port):
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/")
)
Vérifiez tous les fichiers contenant des informations d'identification.
Pour moi, j'avais un nouveau projet dans sbt 1.0 (au lieu du bon vieux 0.13), où j'avais un ~/.sbt/1.0/global.sbt
fichier contenant mes informations d'identification, que j'ai oublié. Ainsi, après un changement de mot de passe obligatoire, les téléchargements artificiels ont été interrompus et ont bloqué mon compte.
Ce serait bien si la chaîne d'informations d'identification et les fichiers qui les remplissaient pouvaient être facilement inspectés. Ce serait aussi bien si SBT était un peu plus prudent et vérifiait d'abord si l'authentification/l'autorisation est correcte, avant de commencer à télécharger les fichiers X et de verrouiller mon compte après 3 tentatives mal authentifiées.