Assembly Jar(组合Jar)与普通Jar的区别就是Assembly Jar会将所有的依赖都打进Jar中,最后生成的包比较大
打包spark程序步骤如下,sbt版本0.13.17:
1. 在project下创建plugins.sbt,并添加内容
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.6")
2. 修改build.sbt文件,添加以下内容
assemblyJarName in assembly := "first-spark-assembly.jar" # 配置jar的名字
assemblyOption in assembly := (assemblyOption in assembly).value.copy(includeScala = false) # 把scala本身排除在组合jar之外,因为spark已经包含了scala
3. 运行 sbt clean assembly
依赖项,%%表示测试时需要,一般为%; % “provided”表示此依赖不打入最终的jar文件内,提交到spark集群中所有spark相关的jar不需要打入到Assembly Jar中
libraryDependencies+="org.apache.spark"%%"spark-core"%"2.2.0"%"provided"
使用阿里云的仓库
resolvers+="aliyun Maven Repository"at"http://maven.aliyun.com/nexus/content/groups/public"
externalResolvers:= Resolver.withDefaultResolvers(resolvers.value,mavenCentral=false)
指定java版本
javacOptions++=Seq("-source","1.8","-target","1.8")
指定主函数
mainClass in Compile:=Some("org.apache.spark.WordCount")
如果有些jar包maven仓库没有,而工程中确实要用到,你可以在项目根录下建立lib文件夹,将额外的jar放进去即可。
或者可以自定义lib文件夹的名称,例如:
unmanagedBase := "mylib"
然后将用到的jar包放到工程根目录的mylib文件夹下,sbt会自动将lib下的jar包中的类加到最终的Assembly Jar中。
sbt打包错误
Unable to find credentials for [Sonatype Nexus Repository Manager @ nx.company.cn]
解决方案:build.sbt文件中添加
credentials += Credentials("Sonatype Nexus Repository Manager", "nx.company.cn", "user", "password")
sbt-native-packager
1. 在project下创建plugins.sbt,并添加内容
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.3.15")
2. 在build.sbt中开启插件支持,JavaAppPackaging只是一种,下面是举例
enablePlugins(JavaAppPackaging)
3. sbt <config-scope>:<config-type>
例:sbt universal:packageBin
universal:packageBin - Generates a universal zip file
universal:packageZipTarball - Generates a universal tgz file
debian:packageBin - Generates a deb
docker:publishLocal - Builds a Docker image using the local Docker server
rpm:packageBin - Generates an rpm
universal:packageOsxDmg - Generates a DMG file with the same contents as the universal zip/tgz.
windows:packageBin - Generates an MSI
sbt-native-packager使用参见官方文档