Scala sbt组件,包括我的jar
我想用我的代码构建一个“胖”罐子。我基本上理解如何做到这一点,但我所有的示例都使用了jar不是本地的想法,我不确定如何在我组装的jar中包含另一个我构建的、scala代码使用的jar。比如,这个JAR必须包含在哪个文件夹中 通常,当我使用spark shell运行当前代码作为测试时,它看起来如下所示:Scala sbt组件,包括我的jar,scala,apache-spark,sbt,Scala,Apache Spark,Sbt,我想用我的代码构建一个“胖”罐子。我基本上理解如何做到这一点,但我所有的示例都使用了jar不是本地的想法,我不确定如何在我组装的jar中包含另一个我构建的、scala代码使用的jar。比如,这个JAR必须包含在哪个文件夹中 通常,当我使用spark shell运行当前代码作为测试时,它看起来如下所示: spark-shell --jars magellan_2.11-1.0.6-SNAPSHOT.jar -i st_magellan_abby2.scala (jar文件与.scala文件位于
spark-shell --jars magellan_2.11-1.0.6-SNAPSHOT.jar -i st_magellan_abby2.scala
(jar文件与.scala文件位于同一路径中)
所以现在我想构建一个build.sbt文件,它做同样的事情,并包含SNAPSHOT.jar文件
name := "PSGApp"
version := "1.0"
scalaVersion := "2.11.8"
resolvers += "Spark Packages Repo" at "http://dl.bintray.com/spark-packages/maven"
//provided means don't included it is there. already on cluster?
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "2.2.0" % "provided",
"org.apache.spark" %% "spark-sql" % "2.2.0" % "provided",
"org.apache.spark" %% "spark-streaming" % "2.2.0" % "provided",
//add magellan here somehow?
)
那么,我应该把jar放在SBT项目文件夹结构中的什么位置,以便在运行SBT assembly时提取它呢?它在主/resources文件夹中吗?参考手册上说的“要包含在主jar中的文件”应该放在哪里
我应该在libraryDependencies中放些什么,让它知道如何添加特定的jar,而不是通过互联网获取它
最后一件事,我也在我的测试代码中做了一些导入,现在我把这些代码放在一个附加了defmain
的对象中,这些代码似乎无法运行
我有过这样的经历:
import sqlContext.implicits.\这在上面的代码中是正确的,它将像这样使用:
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._
import org.apache.spark.sql.functions.udf
val distance =udf {(a: Point, b: Point) =>
a.withinCircle(b, .001f); //current radius set to .0001
}
我不确定是否可以将这些导入内容保存在def主管道内?还是我得把它们搬到别的地方去?(我仍在学习scala并争论范围问题)。一种方法是在本地使用汇编插件()构建胖jar,并
publishLocal
将生成的jar存储到本地ivy2缓存中
这将基于此项目中的build.sbt设置使其可包含在其他项目中,例如:
name := "My Project"
organization := "org.me"
version := "0.1-SNAPSHOT"
将作为“org.me”%%“我的项目”%%“0.1-SNAPSHOT”本地提供
SBT将在尝试从外部回购下载之前搜索本地缓存
然而,这被认为是不好的做法,因为只有最后的项目应该是一个胖罐子。你不应该把一个列为依赖项(很多麻烦)
若PGapp中包含了这个库,那个么就并没有理由让麦哲伦项目成为一个胖罐子。只是在本地发布,没有汇编
另一种方法是使项目作为代码而不是库相互依赖
lazy val projMagellan = RootProject("../magellan")
lazy val projPSGApp = project.in(file(".")).dependsOn(projMagellan)
这使得projMagellan中的projPSGApp-tigger编译成为可能
但这取决于您的用例
只是不要陷入必须手动管理.jar的情况
另一个问题:
import sqlContext.implicits.\u
应始终包含在需要数据帧操作的范围内,因此不应将该导入放在标题中其他导入的附近
更新
根据评论中的讨论,我的建议是:
- 得到麦哲伦报告
git克隆git@github.com:harsha2010/magellan.git
- 创建要处理的分支,例如
git签出-b新东西
- 更改所需的代码
- 然后更新版本号,例如
version:=“1.0.7-SNAPSHOT”
- 本地发布
sbt publishLocal
你会看到(过一会儿):
[信息]将常春藤发布到/Users/tomlous/.ivy2/local/harsha2010/magellan_2.11/1.0.7-SNAPSHOT/ivys/ivy.xml
- 转到其他项目
- 更改
build.sbt
以包括
“harsha2010”%%“magellan”%%“1.0.7-SNAPSHOT”
在您的库依赖项中
现在你有一个很好的(临时)参考你的图书馆
您的PSGApp应该构建为一个胖jar程序集,以传递给Spark
sbt清洁组件
这将拉入定制构建jar
如果麦哲伦项目中的更改对世界其他地区有用,您应该推动您的更改并创建一个请求,以便将来您可以只包含此库的最新版本感谢您的回复。我之所以包括麦哲伦,是因为对项目进行了编辑,并用我们的编辑重新构建了jar。第二,非常感谢你澄清了隐含的观点。当我把这个小小的测试项目打包到一个obj中,用于构建一个jar时,我已经把它移到了标题处。知道它不应该是这种方式,我可以把它移回去。似乎RootProject调用意味着我可以将编辑过的麦哲伦代码“编译”到PSGApp中,我读对了吗?如果是这样的话,我会在构建结构中的什么地方弹出麦哲伦文件夹?不,麦哲伦可以存在于项目文件夹之外(这就是为什么../引用PSGApp根文件夹的build.sbt)也可以是绝对路径。哦,这是有趣的信息,我必须从github获得麦哲伦项目并进行测试构建。谢谢你的信息!我相信要想弄清楚在这里要做什么,我想我也要研究scala中的多项目构建?对于谷歌来说,这似乎是学习如何做到这一点的正确关键词,到目前为止,我还没有完成一个SBT构建,因此是的,在你的麦哲伦项目上使用多项目构建或运行SBT publishLocal
(确保你使用一个快照或不同的版本号,然后直播),并在你的pgapp SBT中包含该引用,因此,它会找到您本地发布的jar(在ivy2缓存中),因为magellan不是您自己的项目,可能希望将来用正式版本替换它,我实际上会使用它。