栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【sbt】sbt package与sbt assembly

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【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

安装:

  1. 在项目/project/下新建一个plugins.sbt
  2. 在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/io.netty/netty-handler/jars/netty-handler-4.0.27.Final.jar:META-INF/io.netty.versions.properties
[error] /Users/qpzhang/.ivy2/cache/io.netty/netty-buffer/jars/netty-buffer-4.0.27.Final.jar:META-INF/io.netty.versions.properties
[error] /Users/qpzhang/.ivy2/cache/io.netty/netty-common/jars/netty-common-4.0.27.Final.jar:META-INF/io.netty.versions.properties
[error] /Users/qpzhang/.ivy2/cache/io.netty/netty-transport/jars/netty-transport-4.0.27.Final.jar:META-INF/io.netty.versions.properties
[error] /Users/qpzhang/.ivy2/cache/io.netty/netty-codec/jars/netty-codec-4.0.27.Final.jar:META-INF/io.netty.versions.properties
[error] Total time: 5 s, completed 2015-11-25 20:20:23

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

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

参考:https://github.com/sbt/sbt-assembly#excluding-jars-and-files
在我们这里,脚本是这样的(注意:sbt是当时最新的 0.13版本):

qpzhang@qpzhangdeMac-mini:~/scala_code/CassandraTest $cat build.sbt

name := "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.first
  case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    oldStrategy(x)
}
3. 参考文章

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

sbt的git仓库

sbt-assembly插件使用

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

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1017042.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号