scala eclipse sbt 应用程序开发

转载自:http://blog.csdn.net/oopsoom/article/details/38363369   


由于Scala有一个比较完备的Eclipse IDE(Scala IDE for Eclipse), 对于不想从eclipse迁移到Iea平台的Dev来说,如何方便、快速、有效得在Eclipse下编译打包开发Scala应用程序尤为重要。Sbt是类似Maven的一个构建工具,我们将使用它来构建发布程序。

    本文会介绍搭建Eclipse开发Scala应用程序的一般步骤,并结合实例演示sbt工具在eclipse里是如何创建项目文件,和编译打包部署程序的。

    这里做个备忘,也为初学者少走弯路而做出点小小的贡献。

  一、环境准备:

   1、Scala : http://www.scala-lang.org/

   2、Scala IDE for Eclipse : http://scala-ide.org

   3、Sbt: http://www.scala-sbt.org/

   4、Sbt Eclipse : https://github.com/typesafehub/sbteclipse  typesafe的一个sbt for eclipse的助手,可以帮助生成eclipse

   5、Sbt Assembly : https://github.com/sbt/sbt-assembly 发布应用程序的一个sbt插件。

   以上列出均为开发时必须的软件环境:

   我的,Scala版本是2.10.3, Sbt版本是0.13

  二、sbt生成scala eclipse项目:

     我们想要在Eclipse里开发scala应用并符合sbt发布程序的文件结构(类似Maven结构),除了手工建立文件结构,还可以采用sbt eclipse的配置方法。

    2.1、添加sbt eclipse插件

     有2种配置方式:

     一种是在~/.sbt/0.13/plugins//build.sbt 里配置addPlugin,这种做法是全局的插件,即对本机所有sbt项目均使用。

    另一种是每个项目不一样的plugins,则是在每个项目跟目录下project/plugins.sbt里进行插件配置。

    比如test_sbt:

[java]  view plain copy
  1. victor@victor-ubuntu:~/workspace/test_sbt$ pwd  
  2. /home/victor/workspace/test_sbt  
[java]  view plain copy
  1. victor-ubuntu:~/workspace/test_sbt$ tree .  
  2. .  
  3. ├── build.sbt  
  4. └── project  
  5.     └── plugins.sbt  
  6.   
  7. 1 directory, 2 files  
    plugins.sbt里面内容配置,添加插件:
[java]  view plain copy
  1. addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.4.0")  
  2.     

   2.2、生成eclipse项目文件

   然后进入到根目录sbt,成功进入sbt,运行eclipse命令生成eclipse的.classpath等eclipse相关文件:

[java]  view plain copy
  1. victor@victor-ubuntu:~/workspace/test_sbt$ ll  
  2. total 28  
  3. drwxrwxr-x 5 victor victor 4096  8月  4 00:38 ./  
  4. drwxrwxr-x 8 victor victor 4096  8月  4 00:28 ../  
  5. -rw-rw-r-- 1 victor victor    0  8月  4 00:38 build.sbt  
  6. -rw-rw-r-- 1 victor victor  589  8月  4 00:38 .classpath  
  7. drwxrwxr-x 4 victor victor 4096  8月  4 00:38 project/  
  8. -rw-rw-r-- 1 victor victor  362  8月  4 00:38 .project  
  9. drwxrwxr-x 4 victor victor 4096  8月  4 00:38 src/  
  10. drwxrwxr-x 4 victor victor 4096  8月  4 00:38 target/  
  可以看到和maven的目录结构是相似的:
[java]  view plain copy
  1. victor@victor-ubuntu:~/workspace/test_sbt$ tree src  
  2. src  
  3. ├── main  
  4. │   ├── java  
  5. │   └── scala  
  6. └── test  
  7.     ├── java  
  8.     └── scala  

  发现没有resouces目录:

  在跟目录的build.sbt里添加:

[html]  view plain copy
  1. EclipseKeys.createSrc :EclipseCreateSrc.Default + EclipseCreateSrc.Resource  
   再执行sbt eclipse  
[java]  view plain copy
  1. victor@victor-ubuntu:~/workspace/test_sbt$ tree src/  
  2. src/  
  3. ├── main  
  4. │   ├── java  
  5. │   ├── resources  
  6. │   └── scala  
  7. └── test  
  8.     ├── java  
  9.     ├── resources  
  10.     └── scala  

   2.3、导入Eclipse中

   我们进入Eclipse,利用导入向导的import existing project into workspace这一项进行导入。

   

    至此,我们的项目结构搭建完成,可以像开发java maven项目一样的开发scala sbt项目了。

   三、开发与部署

    下面准备用一个实际例子演示在Scala里开发的一般步骤,最近用到scala里的json,就用json4s这个json lib来开发一个解析json的例子,json4s地址:https://github.com/json4s/json4s

    3.1、添加依赖

     我们如果想使用第三方的类,就需要添加依赖关系,和GAV坐标,这个再熟悉不过,我们需要编辑根目录下的build.sbt文件,添加依赖:

     这里name,version,scalaVersion要注意每个间隔一行,其它的也是,不然会出错。

     libraryDependencies是添加依赖的地方:我们添加2个。

    resolvers是仓库地址,这里配置了多个。

   如下:

[java]  view plain copy
  1. name := "shengli_test_sbt"  
  2.   
  3. version := "1.0"  
  4.   
  5. scalaVersion := "2.10.3"  
  6.   
  7. EclipseKeys.createSrc := EclipseCreateSrc.Default + EclipseCreateSrc.Resource  
  8.   
  9. libraryDependencies ++= Seq(  
  10.   "org.json4s" %% "json4s-native" % "3.2.10",  
  11.   "org.json4s" %% "json4s-jackson" % "3.2.10"  
  12. )  
  13.   
  14. resolvers ++= Seq(  
  15.       // HTTPS is unavailable for Maven Central  
  16.       "Maven Repository"     at "http://repo.maven.apache.org/maven2",  
  17.       "Apache Repository"    at "https://repository.apache.org/content/repositories/releases",  
  18.       "JBoss Repository"     at "https://repository.jboss.org/nexus/content/repositories/releases/",  
  19.       "MQTT Repository"      at "https://repo.eclipse.org/content/repositories/paho-releases/",  
  20.       "Cloudera Repository"  at "http://repository.cloudera.com/artifactory/cloudera-repos/",  
  21.       // For Sonatype publishing  
  22.       // "sonatype-snapshots"   at "https://oss.sonatype.org/content/repositories/snapshots",  
  23.       // "sonatype-staging"     at "https://oss.sonatype.org/service/local/staging/deploy/maven2/",  
  24.       // also check the local Maven repository ~/.m2  
  25.       Resolver.mavenLocal  
  26. )  
    再次运行sbt eclipse,则依赖的jar包会自动加载到classpath:

       

    3.2、测试程序

    一个简单的解析Json的程序,程序很简单,这里就不解释了。

[java]  view plain copy
  1. package com.shengli.json  
  2. import org.json4s._  
  3. import org.json4s.JsonDSL._  
  4. import org.json4s.jackson.JsonMethods._  
  5.   
  6. object JsonSbtTest extends Application{  
  7.       
  8.   
  9.   case class Winner(id: Long, numbers: List[Int])  
  10.   case class Lotto(id: Long, winningNumbers: List[Int], winners: List[Winner], drawDate: Option[java.util.Date])  
  11.   
  12.   val winners = List(Winner(23, List(245342335)), Winner(54, List(52312111822)))  
  13.   val lotto = Lotto(5, List(2453423753), winners, None)  
  14.   val json =  
  15.     ("lotto" ->  
  16.       ("lotto-id" -> lotto.id) ~   
  17.       ("winning-numbers" -> lotto.winningNumbers) ~  
  18.       ("draw-date" -> lotto.drawDate.map(_.toString)) ~  
  19.       ("winners" ->  
  20.         lotto.winners.map { w =>  
  21.           (("winner-id" -> w.id) ~  
  22.            ("numbers" -> w.numbers))}))  
  23.   
  24.   println(compact(render(json)))  
  25.   println(pretty(render(json)))  
  26. }  

    至此我们在eclipse能运行Run as Scala Application,但是如何加依赖打包发布呢?

    3.3、Assembly

   还记得Spark里面的assembly吗?那个就是发布用的,sbt本身支持的clean compile package之类的命令,但是带依赖的one jar打包方式还是assembly比较成熟。

   Sbt本身的命令:参考http://www.scala-sbt.org/0.13/tutorial/Running.html 和http://www.scala-sbt.org/0.13/docs/Command-Line-Reference.html

cleanDeletes all generated files (in the target directory).
compileCompiles the main sources (in src/main/scala and src/main/java directories).
testCompiles and runs all tests.
consoleStarts the Scala interpreter with a classpath including the compiled sources and all dependencies. To return to sbt, type:quit, Ctrl+D (Unix), or Ctrl+Z (Windows).
run <argument>* Runs the main class for the project in the same virtual machine as sbt.
packageCreates a jar file containing the files in src/main/resources and the classes compiled fromsrc/main/scala andsrc/main/java.
help <command>Displays detailed help for the specified command. If no command is provided, displays brief descriptions of all commands.
reloadReloads the build definition (build.sbtproject/*.scalaproject/*.sbt files). Needed if you change the build definition.

   Assembly

   Assembly是作为一种插件的,所以要在project下面的plugins.sbt里面配置,至此plugins.sbt文件里内容如下:

[java]  view plain copy
  1. resolvers += Resolver.url("artifactory", url("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases"))(Resolver.ivyStylePatterns)  
  2.   
  3. resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"  
  4.   
  5. addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.4.0")  
  6.   
  7. addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")  

    除了插件的配置之外,还需要配置跟目录下build.sbt,支持assembly,在文件头部加入:
[java]  view plain copy
  1. import AssemblyKeys._  
  2. assemblySettings  
   至此build.sbt文件内容如下:
[java]  view plain copy
  1. import AssemblyKeys._  
  2. assemblySettings  
  3.   
  4. name := "shengli_test_sbt"  
  5.   
  6. version := "1.0"  
  7.   
  8. scalaVersion := "2.10.3"  
  9.   
  10. EclipseKeys.createSrc := EclipseCreateSrc.Default + EclipseCreateSrc.Resource  
  11.   
  12. libraryDependencies ++= Seq(  
  13.   "org.json4s" %% "json4s-native" % "3.2.10",  
  14.   "org.json4s" %% "json4s-jackson" % "3.2.10"  
  15. )  
  16.   
  17. resolvers ++= Seq(  
  18.       // HTTPS is unavailable for Maven Central  
  19.       "Maven Repository"     at "http://repo.maven.apache.org/maven2",  
  20.       "Apache Repository"    at "https://repository.apache.org/content/repositories/releases",  
  21.       "JBoss Repository"     at "https://repository.jboss.org/nexus/content/repositories/releases/",  
  22.       "MQTT Repository"      at "https://repo.eclipse.org/content/repositories/paho-releases/",  
  23.       "Cloudera Repository"  at "http://repository.cloudera.com/artifactory/cloudera-repos/",  
  24.       // For Sonatype publishing  
  25.       // "sonatype-snapshots"   at "https://oss.sonatype.org/content/repositories/snapshots",  
  26.       // "sonatype-staging"     at "https://oss.sonatype.org/service/local/staging/deploy/maven2/",  
  27.       // also check the local Maven repository ~/.m2  
  28.       Resolver.mavenLocal  
  29. )  

   运行sbt assembly命令进行发布:

[java]  view plain copy
  1. > assembly  
  2. [info] Updating {file:/home/victor/workspace/test_sbt/}test_sbt...  
  3. [info] Resolving org.fusesource.jansi#jansi;1.4 ...  
  4. [info] Done updating.  
  5. [info] Compiling 1 Scala source to /home/victor/workspace/test_sbt/target/scala-2.10/classes...  
  6. [warn] there were 1 deprecation warning(s); re-run with -deprecation for details  
  7. [warn] one warning found  
  8. [info] Including: scala-compiler-2.10.0.jar  
  9. [info] Including: scala-library-2.10.3.jar  
  10. [info] Including: json4s-native_2.10-3.2.10.jar  
  11. [info] Including: json4s-core_2.10-3.2.10.jar  
  12. [info] Including: json4s-ast_2.10-3.2.10.jar  
  13. [info] Including: paranamer-2.6.jar  
  14. [info] Including: scalap-2.10.0.jar  
  15. [info] Including: jackson-databind-2.3.1.jar  
  16. [info] Including: scala-reflect-2.10.0.jar  
  17. [info] Including: jackson-annotations-2.3.0.jar  
  18. [info] Including: json4s-jackson_2.10-3.2.10.jar  
  19. [info] Including: jackson-core-2.3.1.jar  
  20. [info] Checking every *.class/*.jar file's SHA-1.  
  21. [info] Merging files...  
  22. [warn] Merging 'META-INF/NOTICE' with strategy 'rename'  
  23. [warn] Merging 'META-INF/LICENSE' with strategy 'rename'  
  24. [warn] Merging 'META-INF/MANIFEST.MF' with strategy 'discard'  
  25. [warn] Merging 'rootdoc.txt' with strategy 'concat'  
  26. [warn] Strategy 'concat' was applied to a file  
  27. [warn] Strategy 'discard' was applied to a file  
  28. [warn] Strategy 'rename' was applied to 2 files  
  29. [info] SHA-1: d4e76d7b55548fb2a6819f2b94e37daea9421684  
  30. [info] Packaging /home/victor/workspace/test_sbt/target/scala-2.10/shengli_test_sbt-assembly-1.0.jar ...  
  31. [info] Done packaging.  
  32. [success] Total time: 39 s, completed Aug 42014 1:26:11 AM  
  我们发现文件发布到了/home/victor/workspace/test_sbt/target/scala-2.10/shengli_test_sbt-assembly-1.0.jar

  那我们来执行一下,看是否成功:

  执行:

java -cp /home/victor/workspace/test_sbt/target/scala-2.10/shengli_test_sbt-assembly-1.0.jar com.shengli.json.JsonSbtTest

[java]  view plain copy
  1. victor@victor-ubuntu:~/workspace/test_sbt$ java -cp /home/victor/workspace/test_sbt/target/scala-2.10/shengli_test_sbt-assembly-1.0.jar com.shengli.json.JsonSbtTest  
  2. {"lotto":{"lotto-id":5,"winning-numbers":[2,45,34,23,7,5,3],"winners":[{"winner-id":23,"numbers":[2,45,34,23,3,5]},{"winner-id":54,"numbers":[52,3,12,11,18,22]}]}}  
  3. {  
  4.   "lotto" : {  
  5.     "lotto-id" : 5,  
  6.     "winning-numbers" : [ 2453423753 ],  
  7.     "winners" : [ {  
  8.       "winner-id" : 23,  
  9.       "numbers" : [ 245342335 ]  
  10.     }, {  
  11.       "winner-id" : 54,  
  12.       "numbers" : [ 52312111822 ]  
  13.     } ]  
  14.   }  
  15. }  

   证实发布的结果是成功的。

四、总结

   本文介绍了在Eclipse里利用Sbt构建开发Scala程序的一般步骤,并用实例讲解了整个流程。

   用sbt eclipse插件生成sbt文件目录结构,sbt eclipse命令来生成更新jar包依赖。

   用assebly插件对scala应用进行打包发布。   

——EOF——


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值