sbt:使用本地jar而不破坏依赖项

时间:2016-02-03 19:06:27

标签: apache-spark sbt apache-spark-mllib

我正在构建一个使用Spark和Spark-mllib的应用程序,build.sbt表示依赖关系如下:

  3   libraryDependencies ++= Seq(
  4     "org.apache.spark" %% "spark-core" % "1.6.0" withSources() withJavadoc(),
  5     "org.apache.spark" %% "spark-mllib" % "1.6.0" withSources() withJavadoc()
  6     )

这很好用。现在我想更改mllib中的一些代码并使用sbt重新编译应用程序,这就是我所做的:

  1. 下载spark-1.6.0的源代码,修改mllib中的代码并将其重新编译为名为spark-mllib_2.10-1.6.0.jar的jar
  2. 将上述jar放入项目的lib目录中。
  3. 还将spark-core_2.10-1.6.0.jar放入项目的lib目录中。
  4. 删除build.sbt文件中的libraryDependencies语句。
  5. 运行sbt clean package
  6. 但是,由于缺少spark-core和spark-mllib运行所需的依赖关系,因此无法编译,只有当libraryDependencies的语句写入build文件时,依赖关系才会自动由sbt管理。 SBT。

    所以我把libraryDependencies的声明放回到build.sbt中,希望sbt可以解决依赖性问题,并且仍然使用本地spark-mllib而不是远程存储库中的那个。但是,运行我的应用程序表明情况并非如此。

    所以我想知道是否有办法使用我的本地spark-mllib jar而无需手动解决依赖性问题?

    更新: 我按照Roberto Congiu的第一个方法回答,并使用以下build.sbt成功构建了包:

      1 lazy val commonSettings = Seq(
      2   scalaVersion := "2.10.5",
      3   libraryDependencies ++= Seq(
      4     "org.apache.spark" %% "spark-core" % "1.6.0" withSources() withJavadoc(),
      5     "org.apache.spark" %% "spark-streaming" % "1.6.0" withSources() withJavadoc(),
      6     "org.apache.spark" %% "spark-sql" % "1.6.0" withSources() withJavadoc(),
      7     "org.scalanlp" %% "breeze" % "0.11.2"
      8   )
      9 )
     10 lazy val core = project.
     11   settings(commonSettings: _*).
     12   settings(
     13     name := "xSpark",
     14     version := "0.01"
     15   ) 
     16   
     17 lazy val example = project.
     18   settings(commonSettings: _*).
     19   settings(
     20     name := "xSparkExample",
     21     version := "0.01"
     22   ).
     23   dependsOn(core)
    

    xSparkExample包含一个调用xSpark的KMeans示例,xSpark调用spark-mllib中的KMeans函数。这个spark-mllib是一个自定义的jar,我把它放在core / lib的目录中,这样sbt可以把它当作本地依赖项。

    但是,由于某种原因,运行我的应用程序仍然不使用自定义jar。我甚至使用find . -name "spark-mllib_2.10-1.6.0.jar"来确保我的系统上不存在其他jar。

1 个答案:

答案 0 :(得分:0)

一种方法是将自定义mlib作为非托管依赖项。 非托管依赖项放在一个目录中,SBT将按原样接收它们,因此您还有责任提供它们的依赖项。 您可以在此处阅读有关非托管依赖项的信息:​​http://www.scala-sbt.org/0.13/docs/Library-Dependencies.html

所以,您可以尝试以下方法:

  1. 创建一个lib目录并在那里添加自定义mlib jar。这是非托管lib的默认位置,sbt会自动将其选中
  2. 在你的build.sbt中
  3. ,删除对mlib的引用,并添加其所有的依赖项,这些依赖项列在这里的pom:https://github.com/apache/spark/blob/master/mllib/pom.xml中。您可以跳过具有测试范围的那些。
  4. 另一种方法是拥有自己的maven repo(artifactory)放置自定义工件的位置,并首先从该存储库获取sbt。这样做的好处是,其他人将能够构建代码并使用您的自定义mlib库。