sbt: publicar no repositório corporativo do Nexus não autorizado

Resolução rápida

A credencial necessária espera o domínio exato, conforme definido pelo nexus. Veja abaixo como encontrar o que você definiu, mas com certeza é "Sonatype Nexus Repository Manager". Adicione o restante dos detalhes às credenciais normalmente.

c: /data/user/.sbt/.credentials

realm=Sonatype Nexus Repository Manager
host=nexus
user=repouser
password=password

credenciais build.sbt + = Credenciais (Path.userHome / ".sbt" / ".credentials")

publishTo <<= version { v: String =>
  val nexus = "http://nexus/" 
  if (v.trim.endsWith("SNAPSHOT"))
    Some("snapshots" at nexus + "content/repositories/libs-snapshots")
  else
    Some("releases" at nexus + "content/repositories/libs-releases")
  }

Problema

Estou tentando publicar um jar em um repositório de nexus corporativo.

Eu posso fazer isso bem com o Maven, e eu configurei os repositórios para poder usar o Nexus para fornecer jars internos. No entanto, a publicação falha devido a autorização.

> publish
[info] Packaging c:\app\target\scala-2.10\app_2.10-0.1-sources.jar ...
[info] Wrote D:\app\target\scala-2.10\app_2.10-0.1.pom
[info] :: delivering :: com.app#app_2.10;0.1 :: 0.1 :: release :: Tue May 07 18:28:44 BST     2013
[info] Done packaging.
[info]  delivering ivy file to D:\app\target\scala-2.10\ivy-0.1.xml
[info] Packaging D:\app\target\scala-2.10\app_2.10-0.1.jar ...
[info] Done packaging.
[trace] Stack trace suppressed: run last *:publish for the full output.
[error] (*:publish) java.io.IOException: Access to URL http://nexus/content/groups/common/com/app/app_2.10/0.1/app_2.10-0.1.pom was refused by the server: Unauthorized

c: /data/user/.sbt/.credentials

realm=X 
host=nexus
user=repouser
password=password

c: /data/user/.sbt/repositories

 [repositories]
  local
  x-repo: http://nexus/content/groups/common
  typesafe-ivy-releases: http://repo.typesafe.com/typesafe/ivy-releases/,     [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext]   
  sbt-plugin-releases: http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases/
  maven-central

app / build.sbt

 name := "app"

 organization := "com.app"

 version := "0.1"

 scalaVersion := "2.10.1"

 libraryDependencies ++= Seq(
"org.scalatest" % "scalatest_2.10" % "2.0.M5b" % "test"
 )

 EclipseKeys.withSource := true

 publishMavenStyle := true

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

 publishTo := Some("X Maven Repo" at "http://nexus/content/groups/common")

Meu Maven settings.xml

 <mirrors>
 <mirror>
  <id>x-repo</id>
  <name>X Maven repo</name>
      <url>http://nexus/content/groups/common</url>
  <mirrorOf>*</mirrorOf>
 </mirror>
 </mirrors>

 <servers>
     <server>
       <id>x-repo</id>
       <username>repouser</username>
       <password>password</password>
     </server>
   </servers>

Eu segui as instruções dedocumento oficial e vários outros posts, incluindo o StackOverflow,1 ou lista de discussão, comoisto. Nenhum funcionou. Eu tentei habilitar log extra, mas nenhum detalhe adicional foi dado.

Eu posso implantar manualmente para maven usando este comando:

 mvn deploy:deploy-file -Durl=http://nexus/content/repositories/libs-snapshots -DrepositoryId=x-repo -DgroupId=com.app -DartifactId=app -Dpackaging=jar -Dversion=0.1-SNAPSHOT -Dfile=D:\app\target\scala-2.10\app_2.10-0.1.jar

Tentei usar o seguinte publishTo, também sem sorte

publishTo <<= version { v: String =>
  val nexus = "http://nexus/" 
  if (v.trim.endsWith("SNAPSHOT"))
    Some("snapshots" at nexus + "content/repositories/libs-snapshots")
  else
    Some("releases" at nexus + "content/repositories/libs-releases")
  }

Os comandos são executados em OK até que precisem ser autorizados e, nesse ponto, falham.

O Reino nas credenciais, corresponde ao ID do repositório do servidor no maven ou no nome? Ou não funciona.

Eu tenho tentado habilitar mais registros para o Ivy, mas não consegui mais detalhes.

set ivyLoggingLevel: = UpdateLogging.Full

De acordo com isso, deve haver mais registros:

https://svn.apache.org/repos/asf/ant/ivy/core/tags/2.2.0/src/java/org/apache/ivy/util/url/IvyAuthenticator.java

Estou atrás de um proxy interno, por isso preciso definir usuário HTTP e usuário e senha HTTPS. Talvez seja aqui que está ficando bloqueado?

Alguma sugestão de como aumentar o nível de exploração da hera?

Atualizar

Eu tenho algo para trabalhar, usandosbt-aether-deploy plugin, que usa a infraestrutura Maven (vagão) para implantar.

As credenciais são exatamente as mesmas. Na verdade, o reino não parecia importar.

a seguir estão as linhas usadas:

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

publishTo <<= version { v: String =>
  val nexus = "http://nexus/"
    if (v.trim.endsWith("SNAPSHOT"))
    Some("snapshots" at nexus + "content/repositories/libs-snapshots")
  else 
    Some("releases" at nexus + "content/repositories/libs-releases")
}

seq(aetherSettings: _*)

seq(aetherPublishSettings: _*)

Algo não está certo entre o proxy, hera e nexus.

Eu ainda estaria interessado em sugestões para usar a hera.

Atualização adicional:

Usando

curl -X POST http://nexusUser:nexusPassword@nexus/content/repositories/libs-snapshots -v

Consegui alcançar o servidor.

Mesmo resultado especificando o proxy a ser usado (ele está configurado para ignorar redes locais, mas alguns processos Java como o SBT parecem requerer os cabeçalhos)

Quando nexusUser: nexusPassword não foi especificado, recebi o seguinte cabeçalho:

WWW-Authenticate: BASIC realm = "Sonatype Nexus Repository Manager"

Na verdade, esse era o problema, as credenciais exigiam que o nome do Reino fosse aquele cabeçalho exato, em oposição a outro nome de repositório personalizado, como o maven define.

Muito Obrigado!

questionAnswers(2)

yourAnswerToTheQuestion