web-dev-qa-db-ja.com

「提供された」依存関係を実行/テストタスクのクラスパスに戻す方法

次に例を示しますbuild.sbt

import AssemblyKeys._

assemblySettings

buildInfoSettings

net.virtualvoid.sbt.graph.Plugin.graphSettings

name := "scala-app-template"

version := "0.1"

scalaVersion := "2.9.3"

val FunnyRuntime = config("funnyruntime") extend(Compile)

libraryDependencies += "org.spark-project" %% "spark-core" % "0.7.3" % "provided"

sourceGenerators in Compile <+= buildInfo

buildInfoPackage := "com.psnively"

buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, target)

assembleArtifact in packageScala := false

val root = project.in(file(".")).
  configs(FunnyRuntime).
  settings(inConfig(FunnyRuntime)(Classpaths.configSettings ++ baseAssemblySettings ++ Seq(
    libraryDependencies += "org.spark-project" %% "spark-core" % "0.7.3" % "funnyruntime"
  )): _*)

目標は、スパークコアを持つことです"provided"そのため、それとその依存関係はアセンブリアーティファクトに含まれませんが、run-およびtest関連タスクのランタイムクラスパスに再組み込みします。

最終的にカスタムスコープを使用すると役立つようですが、実際にデフォルト/グローバル実行/テストタスクでカスタムlibraryDependenciesを使用し、できればデフォルトをオーバーライドする方法に困惑しています。私は次のものを試しました:

(run in Global) := (run in FunnyRuntime)

などは役に立ちません。

要約すると、これは本質的にWebケースの一般化であり、サーブレットAPIが「提供」スコープ内にあり、実行/テストタスクは通常、実行中のコードにサーブレットAPIを実際に提供するサーブレットコンテナを分岐します。ここでの唯一の違いは、別のJVM /環境を分岐していないことです。これらのタスクのクラスパスを手動で拡張して、「提供された」スコープを効果的に「元に戻します」が、Assemblyアーティファクトから依存関係を除外し続けます。

38
user2785627

Assembly.sbtで使用した同様の場合:

run in Compile <<= Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run)) 

そして今、「実行」タスクは、「提供済み」とマークされたライブラリを含むすべてのライブラリを使用します。それ以上の変更は必要ありませんでした。

更新:

@robソリューションは、最新のSBTバージョンで動作する唯一のソリューションのようです。build.sbtsettingsに追加するだけです。

run in Compile := Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run)).evaluated,
runMain in Compile := Defaults.runMainTask(fullClasspath in Compile, runner in(Compile, run)).evaluated
49
douglaz

@douglazの答えに加えて、

runMain in Compile <<= Defaults.runMainTask(fullClasspath in Compile, runner in (Compile, run))

runMainタスクに対応する修正プログラムです。

14
tgpfeiffer

_sbt-revolver_プラグインを使用する場合、「reStart」タスクのソリューションは次のとおりです。

_fullClasspath in Revolver.reStart <<= fullClasspath in Compile_

UPD:sbt-1.0の場合、新しい割り当てフォームを使用できます。

fullClasspath in Revolver.reStart := (fullClasspath in Compile).value

2
VasiliNovikov

別のオプションは、アセンブリと実行/テスト用に別々のsbtプロジェクトを作成することです。これにより、sbt asseblyProj/Assemblyは、spark-submitでデプロイするためのファットjarをビルドするために、sbt runTestProj/run Spark embedded。を追加してsbtを介して直接実行する場合。追加の利点として、runTestProjはIntelliJで修正なしで動作し、たとえば= spark sbtで実行する場合のコードのマスター。

val sparkDep = "org.Apache.spark" %% "spark-core" % sparkVersion

val commonSettings = Seq(
  name := "Project",
  libraryDependencies ++= Seq(...) // Common deps
)

// Project for running via spark-submit
lazy val assemblyProj = (project in file("proj-dir"))
  .settings(
    commonSettings,
    Assembly / mainClass := Some("com.example.Main"),
    libraryDependencies += sparkDep % "provided"
  )

// Project for running via sbt with embedded spark
lazy val runTestProj = (project in file("proj-dir"))
  .settings(
    // Projects' target dirs can't overlap
    target := target.value.toPath.resolveSibling("target-runtest").toFile,
    commonSettings,
    // If separate main file needed, e.g. for specifying spark master in code
    Compile / run / mainClass := Some("com.example.RunMain"),
    libraryDependencies += sparkDep
  )
0
Ryan