クイック解決
必要な資格情報は、nexusによって定義された正確なレルムを想定しています。定義したものを見つける方法を以下に示しますが、最も確実なのは「SonatypeNexusリポジトリマネージャー」です。通常どおり、残りの詳細を資格情報に追加します。
c:/data/user/.sbt/.credentials
realm=Sonatype Nexus Repository Manager
Host=nexus
user=repouser
password=password
build.sbt資格情報+ = 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")
}
問題
Jarファイルを企業のネクサスリポジトリに公開しようとしています。
私はMavenからこれをうまく行うことができ、Nexusを使用して内部jarを提供できるようにリポジトリーを構成しました。ただし、承認のために公開は失敗します。
> 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")
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>
公式ドキュメント や、このような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のサーバーリポジトリIDまたは名前に対応していますか?どちらか、またはそれは動作しません。
Ivyのロギングを有効にしようとしていますが、詳細を取得できませんでした。
set ivyLoggingLevel:= UpdateLogging.Full
これによると、さらにログが記録されるはずです。
私は内部プロキシの背後にいるので、HTTPユーザーとHTTPSユーザーとパスワードの両方を設定する必要があります。おそらく、それがブロックされているのはここですか?
ツタの伐採のレベルを上げる方法について何か提案はありますか?
更新
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:nexusPassword@nexus/content/repositories/libs-snapshots -v
サーバーに到達できました。
使用するプロキシを指定した同じ結果(ローカルネットワークをバイパスするように構成されていますが、一部のJava SBTなどのプロセスはヘッダーを必要とするようです)
NexusUser:nexusPasswordが指定されていない場合、次のヘッダーが表示されていました。
WWW-認証:BASIC realm = "Sonatype Nexus Repository Manager"
事実上それが問題でした。資格情報では、Mavenが定義するような他のカスタムリポジトリ名とは対照的に、レルムの名前がその正確なヘッダーである必要がありました。
どうもありがとう!
Ivyは、WWW-Authenticateヘッダーのレルムを使用します。これは、資格情報ファイルで構成されているものと同じバイト単位で一致する必要があります。
sbt-aether-deployは同じヘッダーを使用しますが、デプロイメントメカニズムとしてAetherを使用します。アイビーはしません。
WWW-Authenticateヘッダーの値を把握する最も簡単な方法は、cURLを使用することです。
curl -X POST http://nexus/content/repositories/libs-snapshots -v > /dev/null
cURLは、ユーザーとパスの入力を求めます。
-vは冗長性を追加するため、要求と応答のヘッダーを確認できます。
資格情報ファイルのパスが正しくない可能性があります。これを変更してみてください:
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")
これらが機能しない場合は、資格情報が有効であることを確認してください。