scala sbt assembly 的坑 和打包资源文件

业界一直把sbt simple build tools ,叫成 SB tool,说实话,入门没有maven 和gradle 简单, 稍微不留意就不知道哪里就报错了。

不用sbt 的高阶功能还凑合着用,一旦你想用点,折磨的你死去活来的。
比如 sbt 的plugins,
我就发现 scala sbt 好像跨版本兼容 简直就是狗屎一般,scala 和sbt 的版本最后是用一致的,否则 报错 何时了。
另外 sbt 的plugin 插件 也要用对 版本号的,否则 调试何时了。
另外 sbt 的版本分两个分支 一个 1.0.X 一个 0.13.X,之前一直使用
0.13.13咩有问题,但是发现在 plugin 安装上 0.13.13 和0.13.15都伤透了我的心,我scala 用的是 2.12.1,我发现 sbt 0.13.13 和0.13.15所依赖的scala版本都是 2.10,就差不多 是jdk6吧。最后在sbt 官网选择了,sbt 1.0.4,这个版本算是sbt的 正房了 当时最新版本。
也是用这个版本 真正解决了 sbt-assembly这个难题,用其他版本所出现的问题是,assembly 依赖找不到 ,assembly 命令识别不了,asembly 的关键字无法识别。

参考文件 :https://github.com/sbt/sbt-assembly#using-published-plugin

https://github.com/softprops/assembly-sbt

https://github.com/sbt/sbt-assembly/tree/0.11.2
http://wiki.jikexueyuan.com/project/sbt-getting-started/using-plugin.html
http://www.scala-sbt.org/download.html
下面步入正题
1.首先是目录结构 ,一定不要放错位置了。
用IDEA 创建 sbt scala 项目后,需要额外 再创建两个 文件
./project/plugins.sbt 和 assembly.sbt
其中plugins.sbt在 项目 根目录下的project目录下
assembly.sbt则在 项目的根目录下,放错位置,则assembly就不可以好好运行了

image.png

image.png

然后是文件内容
我的环境是
scala 2.12.1
sbt 1.0.4
java 8
IDEA 2017.2 + 因为他的 scala 插件2017.2.5才开始支持sbt 1.0.x !!!!
使用低版本的IDEA 一直有bug的

在 plugins.sbt中
logLevel := Level.Warn addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.6")
在 ./project/build.properties 中

sbt.version = 1.0.4

在 assembly.sbt

resolvers += Resolver.url("bintray-sbt-plugins", url("http://dl.bintray.com/sbt/sbt-plugin-releases"))(Resolver.ivyStylePatterns)

在 build.sbt

name := "DebugHDP"

version := "1.0"

scalaVersion := "2.12.1"

scalaVersion in ThisBuild := "2.12.1"

lazy val commonSettings = Seq(
  organization := "com.example",
  version := "0.1.0-SNAPSHOT"
)

lazy val app = (project in file(".")).
  settings(commonSettings: _*).
  settings(
    name := "fat-jar-test"
  ).enablePlugins()


resolvers in Global ++= Seq(
  "Sbt plugins"                   at "https://dl.bintray.com/sbt/sbt-plugin-releases",
  "Maven Central Server"          at "http://repo1.maven.org/maven2",
  "TypeSafe Repository Releases"  at "http://repo.typesafe.com/typesafe/releases/",
  "TypeSafe Repository Snapshots" at "http://repo.typesafe.com/typesafe/snapshots/"
)
   

然后在 项目根目录下
输入 sbt update
稍等片刻,sbt首次使用记得 要翻墙 ,或者使用中国仓库镜像
这个时候 assembly 插件一般就会安装成功了
然后 输入 sbt plugins 可查看 本项目中的依赖的插件
`
[info] Loading settings from plugins.sbt ...
[info] Loading project definition from /Users/linkedmemuller/Documents/gitlab/DebugHDP/project
[info] Loading settings from assembly.sbt,build.sbt ...
[info] Set current project to DebugHDP (in build file:/Users/linkedmemuller/Documents/gitlab/DebugHDP/)
In file:/Users/linkedmemuller/Documents/gitlab/DebugHDP/
sbt.plugins.IvyPlugin: enabled in app
sbt.plugins.JvmPlugin: enabled in app
sbt.plugins.CorePlugin: enabled in app
sbt.plugins.JUnitXmlReportPlugin: enabled in app
sbt.plugins.Giter8TemplatePlugin: enabled in app
sbtassembly.AssemblyPlugin: enabled in app

`
我们发现 sbtassembly.AssemblyPlugin: enabled in app

说明assembly插件安装成功了,之后输入
sbt assembly 就可以打 fat jar了
正常的sbt打包是不会把依赖的第三方jar包打到里面的。
然后我们找到 打好的jar 包的路径
在terminal 中 使用

java    -jar   jarName 

然后就可以正常使用了。

另外 sbt 创建的scala 项目是没有resources目录的,需要自己手工创建 ,这也有一个重点就是 resources目录的位置 和maven的不一样
sbt 的Resources 要放在 项目根目录下 ./src/,千万不要放到了./src/main,否则是无法加载到目录下的配置文件的。
最后的是 项目结构是 ./src/resources

我们可以通过 在 ./src/resources 目录下创建 properties属性文件 检验

import java.io.FileInputStream
import java.util.Properties

/**
  * Created by linkedmemuller on 13/12/2017.
  */
class DeHdfs {

}

object  DeHdfs{

  def main(args: Array[String]): Unit = {

    println("hello world clean")

    val fileProperties:Properties=new Properties()
    val filepath=DeHdfs.getClass.getClassLoader.getResource("./file.properties").getPath
    println(filepath)
    fileProperties.load(new FileInputStream(filepath))
    val name=fileProperties.getProperty("Zoo")
    println(name+"name")
  }
}

这个时候还有一点要注意的就是 需要把 ./src/resources 目录 标记为 资源目录 ,
File --> project Structure --> Modules --> 然后找到 ./src/resources
选中 右键点击 选择第三个 Resources就可以了,然后打包时,才可以把 Resource的配置文件打包的jar包中


image.png
image.png

|

2

When you package it the csv-file will reside in the jar archive; right? Then you can't access it directly as a file. Instead you need to ask for a stream:

val stream = getClass.getResourceAsStream("/data.csv")

Possibly you need to wrap the stream in a InputStreamReader for the CSVReader to accept it:

val reader = new InputStreamReader(stream)
CSVReader.open(reader)

@Absurd-Mind you are completely right, it is CSVReader.open(reader). I've corrected the question now. I got it working with @thoredge's approach. But as he said,
I had to wrap the stream in an InputStreamReader as follows:
val reader = new InputStreamReader(getClass.getResourceAsStream("/data.csv"))
and then I used that reader with the CSV reader CSVReader.open(reader)

总的来说 要用流Stream 读取,
getClass.getClassLoader.getResourceAsStream(path)

用普通的getResource 就会失败
在 build.sbt 加入这些
unmanagedSourceDirectories in Test := Seq(baseDirectory.value / "test")

unmanagedResourceDirectories in Compile := Seq(baseDirectory.value / "src/main/resources")

,另外我们也可以选择 直接用IDEA自带的打包工具
File --> project Structure --> Artifacts 创建 新的 包,然后选择 主类。在idea 的菜单栏就选择 Build --- Build Artifacts --build 就可以了

https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000671044-What-is-estimate-to-support-SBT-1-0-x-or-java-lang-ClassNotFoundException-org-jetbrains-sbt-CreateTasks-

What is estimate to support SBT 1.0.x? or java.lang.ClassNotFoundException: org.jetbrains.sbt.CreateTasks$

最新版 IDEA 下载地址
https://www.jetbrains.com/idea/download/#section=mac

https://www.jetbrains.com/idea/download/previous.html?fromIDE=

sbt发布assembly解决jar包冲突问题 deduplicate: different file contents found in the following

http://blog.csdn.net/oopsoom/article/details/41318599

https://stackoverflow.com/questions/25144484/sbt-assembly-deduplication-found-error

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容