Pregunta

Estoy intentando acceder a un administrador de repositorio de Nexus, que requiere un poco de autenticación básica. Todo funciona bien desde Maven2 pero cuando intento cosas configurar en SBT no puede encontrar los artefactos. Está utilizando un patrón repositorio personalizado (véase esta pregunta relacionada ), pero no creo que debería importar. En cualquier caso, la configuración correspondiente está aquí.

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

Según una discusión similar en el grupo de usuarios SBT esto debería funcionar bien, pero me estoy haciendo lo siguiente cuando intento de construir.

==== 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

Estoy bastante seguro de que este es un problema de credenciales y no otra cosa, ya que puede golpear la URL que dice que está tratando directamente y descargar el frasco (después de la autenticación).

También he intentado declarar las credenciales en línea (aunque es menos que ideal) de esta manera:

Credentials.add("Repository Snapshots", "nexusHostIp", "nexususername", "nexuspassword")
¿Fue útil?

Solución

Esto es lo que hice (SBT 0,13 + Artifactory - configuración debería ser similar para Nexus):

1) Editado el archivo ~ / .sbt / repositorios como se especifica aquí: 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) Bloqueado por mi Artifactory a deshabilitar el acceso anónimo.

3) crea un archivo de credenciales en ~ / .sbt / .credentials

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

4) crea un archivo en ~ / .sbt / 0,13 / plugins / credentials.sbt que los cables hasta las credenciales por defecto

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

Ahora, cuando mis cargas de proyecto SBT éxitos Artifactory como normal.

La razón por la que hice de esta manera es mantener las definiciones del repositorio, etc., de los archivos de proyecto para que los equipos puedan tener flexibilidad (que pueden configurar un servidor interno para servir artefactos en curso, etc.).

-Austen

Otros consejos

ACTUALIZACIÓN:. Esta respuesta no funciona en las versiones recientes de SBT - véase la respuesta de Austen lugar

Está bien que finalmente me dieron esta solucionado.

snapshotsName puede ser cualquier cosa. realm en .credentials debe ser el ámbito de autenticación HTTP que se presenta al tratar de golpear la URL del repositorio (nexo en mi caso). realm es también el primer parámetro de Credentials.add. De manera que la línea debería haber sido

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

El nombre de host es el nombre del IP o DNS. Así que en .credentials host es sólo nexusHostIp sin el número de puerto.

Así que la configuración del proyecto de trabajo es:

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")

Con un archivo .credentials que se parece a:

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

Donde "Sonatype Nexus Repository Manager" es el reino de autenticación HTTP.

Si SBT lanzador está fallando para descargar una nueva versión de SBT de su apoderado, y que ~/.sbt/boot/update.log está mostrando que está obteniendo 401 errores de autenticación, puede utilizar los SBT_CREDENTIALS variable de entorno para especificar que el archivo de credenciales es la hiedra.

Cualquiera de ellas debe trabajar y descargar la nueva versión SBT:

  1. SBT_CREDENTIALS='/home/YOUR_USER_NAME/.ivy2/.credentials' sbt
  2. Poner export SBT_CREDENTIALS="/home/YOUR_USER_NAME/.ivy2/.credentials" en su .bashrc (o .zshrc), iniciar una nueva sesión de shell y luego ejecutar sbt

(necesitará tiene la configuración de archivos ~/.ivy2/.credentials como otras respuestas aquí se muestran)

Fuente: https://github.com/sbt/sbt/commit/96e5a7957c830430f85b6b89d7bbe07824ebfc4b

Tras la SBT Documetation :

Hay dos formas de especificar las credenciales para dicho repositorio:

Inline

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

Archivo externo

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

El archivo de credenciales es un archivo de propiedades con las llaves dominio, host, usuario y contraseña. Por ejemplo:

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

Esto funcionó para mí. Estoy usando la versión 0.13.15 SBT:

~/.ivy2/.my-credentials (host sin puerto):

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

build.sbt (url nexo con el puerto):

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/")
)

Comprobar si todos los archivos que contienen las credenciales.

Para mí, yo tenía un nuevo proyecto en SBT 1.0 (en lugar de la vieja 0.13), donde tenía un archivo que contiene ~/.sbt/1.0/global.sbt mis credenciales, que me había olvidado. Así que después de un cambio de contraseña obligatoria, las descargas Artifactory estaba rota y el bloqueo de mi cuenta.

Sería bueno si la cadena de credenciales y archivos llenándolos se puede inspeccionar fácilmente. También sería bueno si SBT era un poco más cuidado y la primera comprobación de si la autenticación / autorización es correcta, antes de iniciar los archivos de descarga tot X y bloquear mi cuenta después de 3 intentos misauthenticated.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top