scala 101

* scala 安装:

下载可以执行的文件. 注意版本.  spark 0.8.0 对应的scala 为2.9.3

 

* scala 编译: 和java 很像:

1,  直接编译脚本:

scalac HelloWorld.scala

scala -classpath . HelloWorld

 

2, sbt 打包编译.  类比maven

1), 安装sbt. 官网下载, 里面主要是sbt-langh.jar

sbt 脚本:

SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"

chmod a+x sbt 使其成为可执行文件.  

显然, sbt 脚本中调用 sbt-launch.jar 来完成实际的工作. 

 

2), 项目目录结构:

$ find .
.
./simple.sbt
./src
./src/main
./src/main/scala
./src/main/scala/SimpleJob.scala

 

是不是和maven一样?!

 

3), 其中 simple.sbt 相当于pom文件

实例如下:

import AssemblyKeys._

seq(assemblySettings: _*)

name := "simple_project"

version := "1.0"

scalaVersion := "2.9.3"

libraryDependencies ++= Seq(
  ("org.apache.spark" %% "spark-core" % "0.8.1-incubating").
    exclude("org.mortbay.jetty", "servlet-api").
    exclude("commons-beanutils", "commons-beanutils-core").
    exclude("commons-collections", "commons-collections").
    exclude("commons-collections", "commons-collections").
    exclude("com.esotericsoftware.minlog", "minlog")
)

mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
  {
    case PathList("javax", "servlet", xs @ _*)         => MergeStrategy.first
    case PathList(ps @ _*) if ps.last endsWith ".html" => MergeStrategy.first
    case "application.conf" => MergeStrategy.concat
    case "unwanted.txt"     => MergeStrategy.discard
    case x => old(x)
  }
}

resolvers += "Akka Repository" at "http://repo.akka.io/releases/"

 

打包命令:

sbt package

执行:

sbt run

 

* 注意, sbt文件两行之间必须有空行..  否则有 unexpect eof 等报错.. 

为啥有这样的规定, 表示很奇怪.  注意就行.  不差这一下回车 :)

 

4), 如何对项目将所有依赖达成jar 包, 用于线上系统的部署?

A: 使用插件: sbt assembly

a), 在project/plugins.sbt 中增加一行:

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.9.2")

 

b), 在simple.sbt中增加:

import AssemblyKeys._

seq(assemblySettings: _*)

 

c), 运行命令: sbt assembly

打完的包在target/scala-*/中.  simple_project-assembly-....jar

可以对比下和sbt package编译出来包的大小~~

 

注意这里里面可能有重复依赖的问题... 

参考上面给的simple.dat文件给出的解决方法. 

 

为啥能解决问题. 表示也不清楚, 直接给连接吧:

https://github.com/sbt/sbt-assembly#excluding-jars-and-files  解决多个包依赖不同版本的问题. 

https://github.com/sbt/sbt-assembly#merge-strategy   解决同一个包, 被多次依赖的问题. 

 

 

* 其他scala入门资料:

scala 程序入门: http://www.ibm.com/developerworks/cn/java/j-lo-funinscala2/ 

scala  tutorial: http://www.scala-lang.org/old/sites/default/files/linuxsoft_archives/docu/files/ScalaTutorial-zh_CN.pdf

spark 官方 scala 程序中文版: http://www.cnblogs.com/vincent-hv/p/3298416.html 

 

END

posted on 2014-04-14 16:00  foreveryl  阅读(417)  评论(0编辑  收藏  举报