1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 【sbt】sbt package与sbt assembly

【sbt】sbt package与sbt assembly

时间:2022-02-24 20:46:54

相关推荐

【sbt】sbt package与sbt assembly

1. sbt packge

命令解释:

创建一个Jar文件,位置在target文件夹中,其中包含:src/main/resources、src/main/scala中的类文件;另外Test/package命令也会产生一个jar文件,其中包含:src/test/resources、src/test/scala中的类文件。

缺点:

sbt package不会将如下打包:

(1)项目的依赖包,即在 build.sbt 中定义的那些依赖包。

(2)用来在分布式环境中执行时所需要的 Scala 的 Jar 包

所以sbt package比较适合做spark练习,不适用于大型开发

举个例子:当你仅依赖spark库时,只使用sbt package就可以,因为在spark master和worker上面都有;但是如果依赖mysql的jdbc这些第三方库, 只使用sbt的 package 命令打包,是不会把这些第三方库打包进去的。这样在spark上面运行就会报错

sbt assembly命令很好的解决了该缺点

2. sbt assembly

assembly中文意思是集合,聚集的意思,名词

命令解释:

assembly pulgin是sbt的一个插件,负责把项目所依赖的所有jar包打成一个fat jar

安装:

在项目/project/下新建一个plugins.sbt在plugins.sbt文件中写

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.4")addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.10.0-RC1")

缺点:

主要集中在遇到重名文件时候所处的困境,先来看个例子

[error] 1 error was encountered during merge[trace] Stack trace suppressed: run last *:assembly for the full output.[error] (*:assembly) deduplicate: different file contents found in the following:[error] /Users/qpzhang/.ivy2/cache/ty/netty-handler/jars/netty-handler-4.0.27.Final.jar:META-INF/ty.versions.properties[error] /Users/qpzhang/.ivy2/cache/ty/netty-buffer/jars/netty-buffer-4.0.27.Final.jar:META-INF/ty.versions.properties[error] /Users/qpzhang/.ivy2/cache/ty/netty-common/jars/netty-common-4.0.27.Final.jar:META-INF/ty.versions.properties[error] /Users/qpzhang/.ivy2/cache/ty/netty-transport/jars/netty-transport-4.0.27.Final.jar:META-INF/ty.versions.properties[error] /Users/qpzhang/.ivy2/cache/ty/netty-codec/jars/netty-codec-4.0.27.Final.jar:META-INF/ty.versions.properties[error] Total time: 5 s, completed -11-25 20:20:23

大概是说,这里面有很多路径一样的重复文件,它处理不了。怎么办?

只好手动来进行判断,assembly提供了不打包文件的规则,这些可以用脚本写在build.sbt文件中。

参考:/sbt/sbt-assembly#excluding-jars-and-files

在我们这里,脚本是这样的(注意:sbt是当时最新的 0.13版本):

qpzhang@qpzhangdeMac-mini:~/scala_code/CassandraTest $cat build.sbtname := "CassandraTest"version := "1.0"scalaVersion := "2.10.4"#spark的依赖直接忽略, 使用关键词provided表示运行环境已经有,不需要打包libraryDependencies += "org.apache.spark" %% "spark-core" % "1.5.2" % "provided"#依赖spark-cassandra-connector的库libraryDependencies += "com.datastax.spark" %% "spark-cassandra-connector" % "1.5.0-M2"#如果后缀是.properties的文件,合并策略采用(MergeStrategy.first)第一个出现的文件assemblyMergeStrategy in assembly := {case PathList(ps @ _*) if ps.last endsWith ".properties" => MergeStrategy.firstcase x =>val oldStrategy = (assemblyMergeStrategy in assembly).valueoldStrategy(x)}

3. 参考文章

sbt的assembly插件使用(打包所有依赖)

sbt的git仓库

sbt-assembly插件使用

sbt官方文档(一定看英文的,中文的不全)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。