我想构建一个代码的'胖'罐子。我理解如何做到这一点,但所有的例子我都使用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文件位于同一路径中)
所以现在我想构建一个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程序集时它被拾取?那是在main / resources文件夹中吗?参考手册中说的是'要包含在主罐中的文件'去哪里?
我会在这里放入库依赖项,以便它知道添加特定的jar而不是去网上获取它?
最后一件事,我还在我的测试代码中进行了一些导入,现在我将这段代码放在一个附加了def main
的对象中。
我有类似的事情:
导入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 main中吗?或者我必须以某种方式将它们移到别处? (我还在学习scala和争论范围)。
答案 0 :(得分:3)
一种方法是在本地使用程序集插件(https://github.com/sbt/sbt-assembly)和publishLocal
构建胖jar,将生成的jar存储到本地ivy2缓存中
这将使其可以基于此项目中的build.sbt设置包含在您的其他项目中,例如:
name := "My Project"
organization := "org.me"
version := "0.1-SNAPSHOT"
将在"org.me" %% "my-project" % "0.1-SNAPSHOT"
本地提供
在尝试从外部存储库下载之前,SBT将搜索本地缓存。
然而,这被认为是不好的做法,因为只有最终的项目才能成为一个胖子。你永远不应该把一个作为依赖(很多头痛)。
如果PGapp中包含库,那么没有理由让magellan项目成为一个胖子。只需发布没有汇编的本地
另一种方法是使项目彼此依赖为代码,而不是库。
lazy val projMagellan = RootProject("../magellan")
lazy val projPSGApp = project.in(file(".")).dependsOn(projMagellan)
这使得在projMagellan中的projPSGApp tigger编译中进行编译。
但这取决于你的用例。
只是不要陷入必须手动管理.jar的情况
另一个问题:
import sqlContext.implicits._
应始终包含在需要数据帧操作的范围内,因此您不应将该导入放在标题中的其他导入附近
更新
根据评论中的讨论,我的建议是:
git clone git@github.com:harsha2010/magellan.git
git checkout -b new-stuff
version := "1.0.7-SNAPSHOT"
sbt publishLocal
你会看到类似的东西(过了一会儿):
[info]将常春藤发布到/Users/tomlous/.ivy2/local/harsha2010/magellan_2.11/1.0.7-SNAPSHOT/ivys/ivy.xml
build.sbt
以包含"harsha2010" %% "magellan" % "1.0.7-SNAPSHOT"
中的 libraryDependencies
现在您对库有一个很好的(临时)引用。
您的PSGApp应该构建为胖jar程序集以传递给Spark
sbt clean assembly
这将引入自定义构建jar
如果magellan项目中的更改对世界其他地方有用,您应该推送更改并创建拉取请求,以便将来可以包含此库的最新版本