2013-05-07 2 views
21

Быстрого разрешениеSBT: публикации в корпоративное хранилище Nexus несанкционированном

Требуемого удостоверение ожидает точную область, как это определенно связующим. См. Ниже, как найти тот, который вы определили, но, безусловно, это «Sonatype Nexus Repository Manager». Добавьте остальные данные в учетные данные как обычно.

гр: /data/user/.sbt/.credentials

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

build.sbt учетных данных + = Полномочия (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") 
    } 

Проблема

Я пытаюсь опубликовать баночку в корпоративную связующей репо.

Я могу сделать это отлично от Maven, и я настроил хранилища, чтобы использовать Nexus для предоставления внутренних банок. Однако публикация не удалась из-за авторизации.

> 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 

гр: /data/user/.sbt/.credentials

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

гр: /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 

приложение/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") 

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

Я следовал инструкции от official doc и различных других должностей, в то числе StackOverflow такого это one или почтовый список таких как this. Никто не работал. Я попытался включить дополнительную регистрацию, но подробности не приводятся.

можно вручную развернуть на Maven с помощью этой команды:

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 

Пробовал с помощью следующей publishTo, также без везения

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

Команды хорошо работать, пока они не должны быть разрешены, при котором они терпят неудачу.

Область в учетных данных, соответствует ли она идентификатору сервера в maven или имени? Либо, либо он не работает.

Я пытался включить больше регистрации для Айви, но не мог получить более подробную информацию.

set ivyLoggingLevel: = UpdateLogging.Полный

В соответствии с этим, следует дополнительно каротаж:

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

Я за внутренний прокси-сервер, так что мне нужно, чтобы установить оба пользователя HTTP и HTTPS и пароль пользователя. Может быть, здесь он блокируется?

любые предложения, как повысить уровень регистрации плюща?


Update

У меня есть что-то работать, используя sbt-aether-deploy плагина, который использует Maven инфраструктуру (универсал) для развертывания.

Учетные записи являются точно такими же. На самом деле, царство, казалось, не имело значения.

следующие строки используются:

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: _*) 

Что-то не прав между прокси, плюща и связующей.

Меня все равно будут интересовать предложения по использованию плюща.


Дальнейшее обновление:

Использование

curl -X POST http://nexusUser:[email protected]/content/repositories/libs-snapshots -v 

Я был в состоянии получить доступ к серверу.

Тот же результат определение прокси для использования (он настроен для обхода для локальных сетей, но некоторая ява процессы, как SBT, кажется, требуют заголовков)

Когда nexusUser: nexusPassword не specificied, я получаю следующий заголовок :

WWW-Authenticate: BASIC область = «Sonatype Nexus Repository Manager»

эффективно, что была проблема, что учетные данные, необходимые имя Realm быть, что точный заголовок, в отличие от других пользовательских репозиториев имя, как maven определяет.

Большое спасибо!

ответ

22

Ivy использует область заголовка WWW-Authenticate, которая должна соответствовать байту за байтом, равному байту, настроенному в вашем файле учетных данных.

sbt-aether-deploy использует тот же заголовок, но использует его как механизм развертывания. Айви этого не делает.

Самый простой способ узнать значение заголовка WWW-Authenticate - использовать cURL.

curl -X POST http://nexus/content/repositories/libs-snapshots -v > /dev/null 

cURL предложит вам пройтись и пройти.

-v добавит многословия, чтобы вы могли видеть заголовки запроса и ответа.

+0

Спасибо, это определенно помогло. См. Мое редактирование в вопросе – fracca

+5

Еще одно очень важное замечание: хост в файле учетных данных должен быть просто IP или доменным именем сервера Nexus. Если вы включите порт, он не будет выбирать учетные данные. –

+0

Боже, это сводило меня с ума !!! Огромное спасибо! – Magnus

2

Я подозреваю, что путь к вашему учетному файлу может быть неправильным. Попробуйте изменить это:

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

к тому, что:

credentials += Credentials("c:/data/user/.sbt/.credentials") 

или попробовать непосредственно для устранения первых:

credentials += Credentials("Sonatype Nexus Repository Manager", 
    "nexus.scala-tools.org", "admin", "admin123") 

Если они не работают, проверьте, что ваши учетные данные верны.

+1

Я пробовал либо жестко кодировать путь, либо использовать учетные данные непосредственно в файле. Это не работает. – fracca

Смежные вопросы