web-dev-qa-db-ja.com

sbtでローカルのMavenプロキシリポジトリ(Nexus)を使用するにはどうすればよいですか?

現在、Webからアーティファクトをプルするsbt(Scala)プロジェクトを持っています。アーティファクトをキャッシュする企業標準化されたNexusリポジトリに移行したいと考えています。 Nexusのドキュメントから、Mavenプロジェクトでそれを行う方法を理解しています。しかし、sbtは明らかに異なるアプローチを使用しています。 (Ivyが何らかの形で関与していることは理解していますが、Ivyを使用したことはなく、どのように機能するか理解していません。)

すべての依存関係に企業のNexusリポジトリシステムを使用するようにsbtや基盤となるIvyに指示するにはどうすればよいですか?ソースリポジトリの新しいクローンが自動的にプロキシを使用するように、何らかのプロジェクトレベルの構成ファイルを使用するように答えたいです。 (つまり、ドットディレクトリにあるユーザーごとの設定ファイルをいじくり回すことは現実的ではありません。)

ありがとう!

72
Harlan

ステップ1: 詳細なトピック:プロキシリポジトリ の指示に従います。これを要約して以下に追加しました。

  1. (Artifactoryを使用している場合は、この手順をスキップできます。)ivy-styleをプロキシするために、企業のMavenリポジトリに完全に分離 Mavenプロキシリポジトリ(またはグループ)を作成します。これら2つの重要なリポジトリなどのリポジトリ:

    これが必要なのは、一部のリポジトリマネージャーは、混在しているIvyスタイルのリポジトリとMavenスタイルのリポジトリを処理できないためです。

  2. ファイルrepositoriesを作成し、メインの企業リポジトリと手順1で作成した追加のリポジトリの両方を以下に示す形式でリストします。

    [repositories]
      my-maven-proxy-releases: http://repo.example.com/maven-releases/
      my-ivy-proxy-releases: http://repo.example.com/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
    
  3. そのファイルをホームディレクトリ内の.sbtディレクトリに保存するか、sbtコマンドラインで指定します。

    sbt -Dsbt.repository.config=<path-to-your-repo-file>
    

古いバージョンのsbtを使用している場合の朗報:少なくとも、sbt 0.12.0ランチャーjarでは、古いsbtバージョンのブートプロパティファイル必要な行(repository.configに言及する行)を含めないでください。これらのファイルを編集して必要な行を追加し、sbt 0.12.0ランチャーjarに再パッケージしても、sbtのこれらのバージョンで動作します。 !これは、この機能がsbt自体ではなく、ランチャーに実装されているためです。また、sbt 0.12.0ランチャーは、sbtのすべてのバージョンを0.7に戻すことができると主張されています!

ステップ2:外部リポジトリーが使用されていないことを確認するには、リゾルバーからデフォルトのリポジトリーを削除します。これは、次の2つの方法のいずれかで実行できます。

  1. 上記の詳細トピックページに記載されているコマンドラインオプション-Dsbt.override.build.repos=trueを追加します。これにより、ファイルで指定したリポジトリが、sbtファイルで指定されたリポジトリを上書きします。ただし、これはsbt 0.12以降でのみ動作する可能性があります-まだ試していません。
  2. fullResolvers := Seq(または)の代わりに、ビルドファイルでresolvers ++=企業Mavenリポジトリのリゾルバーresolvers :=を使用しますつかいます。
32
Robin Green

わかりました。sbtメーリングリストのMark Harrahの助けを借りて、うまくいく答えがあります。

私のビルドクラスは次のようになりました(その他のリポジトリもあります)。

import sbt._

//By extending DefaultWebProject, we get Jetty support
class OurApplication(info: ProjectInfo) extends DefaultWebProject(info) {

  // This skips adding the default repositories and only uses the ones you added
  // explicitly. --Mark Harrah
  override def repositories = Set("OurNexus" at "http://our.nexus.server:9001/nexus/content/groups/public/") 
  override def ivyRepositories = Seq(Resolver.defaultLocal(None)) ++ repositories

  /* Squeryl */
  val squeryl = "org.squeryl" % "squeryl_2.8.0.RC3" % "0.9.4beta5"

  /* DATE4J */
  val date4j = "hirondelle.date4j" % "date4j" % "1.0" from "http://www.date4j.net/date4j.jar"

  // etc
}

今、マシンの.ivy2/cacheディレクトリからSquerylツリーを削除すると、sbtは適切なURLでNexusツリーからそれを取得しようとします。問題が解決しました!

12
Harlan

必要なのは、プロパティファイルsbt.boot.propertiesを定義することです。

  • ivyキャッシュの場所を再定義します(そうしないと、それが ローミングWindowsプロファイル の一部になります。これは、ショップのディスクスペースが大幅に制限されています。 Issue 74 を参照してください)
  • 必要な他のMavenリポジトリを定義します
 C:\ HOMEWARE\apps\sbt-0.74\sbt.boot.properties 
 
 [scala] 
バージョン:2.7.7 
#分類子:ソース、javadoc 
 
 [アプリ] 
組織:org.scala-tools.sbt 
名前:sbt 
バージョン:read(sbt .version)
クラス:sbt.xMain 
コンポーネント:xsbti 
クロスバージョン:true 
分類子:ソース、javadoc 
 
 [リポジトリ] 
 local 
 my-nexus:http://my.nexus/nexus/content/repositories/scala-tools/、[organization]/[module]/[revision]/ [type] s/[artifact](-[classifier])。[ext] 
 maven-local 
#sbt-db:http://databinder.net/repo/、[organization]/[モジュール]/[リビジョン]/[タイプ] s/[アーティファクト](-[分類子])。[ext] 
#maven-central 
#scala-tools-releases 
#scala-tools-snapshots 
 
 [boot] 
ディレクトリ:project/boot 
プロパティ:project/build.properties 
プロンプト作成:プロジェクトが存在しないため、新しいプロジェクトを作成しますか?
プロンプト入力:true 
クイックオプション:true 
 
 [ログ] 
レベル:debug 
 
 [app-properties] 
 project.name:quick = set(test)、new = Prompt(Name)[p]、fill = Prompt(Name )
 project.organization:new = Prompt(Organization)[org.vonc] 
 project.version:quick = set(1.0)、new = Prompt(Version)[1.0]、fill = Prompt (バージョン)[1.0] 
 build.scala.versions:quick = set(2.8.0.RC2)、new = Prompt(Scala version)[2.8.0.RC2]、fill = Prompt(Scala version) [2.8.0.RC2] 
 sbt.version:quick = set(0.7.4)、new = Prompt(sbt version)[0.7.4]、fill = Prompt(sbt version)[0.7.4] 
 project.scratch:quick = set(true)
 project.initialize:quick = set(true)、new = set(true)
 
 [ivy] 
 cache-directory:C:\ HOMEWARE\projects\.ivy2\cache 

注:このsbt.boot.propertiesファイルは、以下からインスピレーションを受けています。

任意のexternalMavenリポジトリ定義にコメントし、独自のNexus Mavenリポジトリへの参照を追加しました。

ランチャーは、優先順位の高い順に次のいずれかの方法で構成できます。

  • jar/sbt/sbt.boot.propertiesファイルを置き換えます。
  • sbt.boot.propertiesという名前の構成ファイルをクラスパスに配置します。 /sbtプレフィックスなしでクラスパスルートに配置します。
  • コマンドラインで代替構成の場所を指定します。これは次の方法で実行できます。
    • システムプロパティとして場所を指定するsbt.boot.properties
    • または、先頭に「@」が付いたランチャーへの最初の引数として。

システムプロパティの優先順位は低くなっています。
相対パスの解像度は次のとおりです。

  • 現在の作業ディレクトリに対して最初に試行された、
  • 次に、ユーザーのホームディレクトリに対して、
  • そして、ランチャーjarを含むディレクトリに対して。

これらの試行がいずれも成功しない場合、エラーが生成されます。


Sbt.batラッパーを定義します(必ずyoursbt.boot.properties)を指定するには:

C:\HOMEWARE>more C:\HOMEWARE\bin\sbt.BAT
@echo off
set t=%~dp0
set adp0=%t:C:\="%"

set SBT_DIR=%adp0%..\apps\sbt-0.74
dir C:\%SBT_DIR%\sbt-launch-0.7.4.jar
# if needed, add your proxy settings
set PROXY_OPTIONS=-Dhttp.proxyHost=my.proxy -Dhttp.proxyPort=80xx -Dhttp.proxyUser=auser -Dhttp.proxyPassword=yyyy
set Java_OPTIONS=-XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256m -Xmx512M -cp C:\HOMEWARE\apps\sbt-0.74\sbt-launch-0.7.4
set SBT_BOOT_PROPERTIES=-Dsbt.boot.properties="sbt.boot.properties"
cmd /C C:\HOMEWARE\apps\jdk4Eclipse\bin\Java.exe %PROXY_OPTIONS% %Java_OPTIONS% %SBT_BOOT_PROPERTIES% -jar C:\HOMEWARE\apps\sbt-0.74\sbt-launch-0.7.4.jar %*

そして、sbtは以下からアーティファクトonlyをダウンロードします:

  • あなたのネクサス
  • ローカルのMavenリポジトリ。

自宅で実行していた古いNexusオープンソース1.6でテストしたところ、Java 1.6、sbt07.4

C:\Prog\Java\jdk1.6.0_18\jre\bin\Java  -Xmx512M -Dsbt.boot.properties=sbt.boot.properties - jar "c:\Prog\Scala\sbt\sbt-launch-0.7.4.jar"  

それは与える:

[success] Build completed successfully.
C:\Prog\Scala\tests\pp>sbt
Getting Scala 2.8.0 ...
downloading http://localhost:8081/nexus/content/repositories/scala/org/scala-lang/scala-compiler/2.8.0/scala-compiler-2.
8.0.jar ...
        [SUCCESSFUL ] org.scala-lang#scala-compiler;2.8.0!scala-compiler.jar (311ms)
downloading http://localhost:8081/nexus/content/repositories/scala/org/scala-lang/scala-library/2.8.0/scala-library-2.8.
0.jar ...
        [SUCCESSFUL ] org.scala-lang#scala-library;2.8.0!scala-library.jar (185ms)
:: retrieving :: org.scala-tools.sbt#boot-scala
        confs: [default]
        2 artifacts copied, 0 already retrieved (14484kB/167ms)
[info] Building project test 0.1 against Scala 2.8.0
[info]    using sbt.DefaultProject with sbt 0.7.4 and Scala 2.7.7

Sbt.boot.propertiesファイルで面白い値を試してみると:

C:\Prog\Scala\tests\pp>sbt
Getting Scala 2.9.7 ...

:: problems summary ::
:::: WARNINGS
                module not found: org.scala-lang#scala-compiler;2.9.7
        ==== nexus: tried
          http://localhost:8081/nexus/content/repositories/scala/org/scala-lang/scala-compiler/2.9.7/scala-compiler-2.9.7.pom
          -- artifact org.scala-lang#scala-compiler;2.9.7!scala-compiler.jar:
          http://localhost:8081/nexus/content/repositories/scala/org/scala-lang/scala-compiler/2.9.7/scala-compiler-2.9.7.jar

したがって、定義した2つのリポジトリに限定されます。

[repositories]
nexus:  http://localhost:8081/nexus/content/repositories/scala
nexus2: http://localhost:8081/nexus/content/repositories/scala, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext]

(他のすべてにコメントしました:localmaven-local、...)

リポジトリにコメントallし、sbt.boot.propertiesのscalaバージョンに面白い値(2.7.9)を入力すると、 get(OPがしたように)

C:\Prog\Scala\tests\pp>sbt
Error during sbt execution: No repositories defined.

2.7.7を(allリポジトリにコメントを付けたまま)入れた場合、はい、エラーは生成されません:

C:\Prog\Scala\tests\pp>sbt
[info] Building project test 0.1 against Scala 2.8.0
[info]    using sbt.DefaultProject with sbt 0.7.4 and Scala 2.7.7

しかし、それは、前回の試行中に既にscala2.8.0をダウンロードしていたからです。
そのライブラリをproject/bootディレクトリから削除すると、例外がスローされます。

[info]    using sbt.DefaultProject with sbt 0.7.4 and Scala 2.7.7
> C:\Prog\Scala\tests\pp>sbt
Error during sbt execution: No repositories defined.
        at xsbt.boot.Pre$.error(Pre.scala:18)
        at xsbt.boot.Update.addResolvers(Update.scala:197)
...
        at xsbt.boot.Boot$.main(Boot.scala:15)
        at xsbt.boot.Boot.main(Boot.scala)
Error loading project: Error during sbt execution: No repositories defined.
9
VonC

sbt_home/conf "sbtconfig.txt"の設定ファイルを編集します

2行追加

-Dsbt.override.build.repos=true
-Dsbt.repository.config="C:/Program Files (x86)/sbt/conf/repo.properties"

repo.propertiesのコンテンツは

[repositories]
    local
    public: http://222.vvfox.com/public  <-fix this ,write your local nexus group url
6
foxundermon

まあこれはしばらくの間私を悩ませてきたので、githubでMaven用のSBTプラグインを書いた男を見つけました maven-sbt プロジェクトとmaven.MavenDependenciesのミックスイン、およびupdateやlocal-publishなどのすべての操作は、ローカルのmavenと連携します。それについての素晴らしいところは、あなたが私のようであるならば、あなたの組織はすべてMavenです。したがって、すべてのライブラリはローカルのMavenリポジトリにありますが、何らかの理由で最初にsbtを使用してビルドすると、ivyの束またはjarも取得し始めます。 Mavenビルド用にそれらを取得する必要があるため、スペースと時間の無駄です。

そうは言っても、これがsbtに組み込まれればいいので、すべてのプロジェクトに追加する必要はありません。少なくともプロセッサーとして。彼は、私が読んだことの1つで、0.9に追加したいと述べましたが、見つけることができませんでした。

5
ozone

~/.sbt/repositoriesに空のファイルがあったため、このエラーが発生しました。リポジトリをファイルに追加し、ファイルを削除することで問題は解決しました。

0
mehtunguh