• 使用SBT构建Scala项目


    一、安装SBT

    在SBT的官网(http://www.scala-sbt.org/)下载相应版本的SBT,此处我下载的是:sbt-0.13.15.msi

    附sbt-0.13.15.msi百度云盘下载地址:链接:http://pan.baidu.com/s/1eSxi1Ku 密码:59e7

    双击sbt-0.13.15安装sbt环境。

    Windows环境下建议配置SBT的环境变量。具体步骤不说了,就是把sbt/bin目录配置进PATH:

    在SBT_HOME/bin下有个sbt.bat,查看该bat文件。可以了解到该文件依赖于SBT_HOME/conf/sbtconfig.txt。

    SBT_HOME/conf/sbtconfig.txt中添加:

    
    
    1. -Dfile.encoding=UTF8
    2.  
    3. -Dsbt.boot.directory=d:/sbt-repository/boot/
    4.  
    5. -Dsbt.ivy.home=d:/sbt-repository/

     说明:-Dsbt.boot.directory、-Dsbt.ivy.home这两个是配置sbt.boot目录和ivy.home目录,用于缓存的jar包等信息存放位置。默认情况下jar包等信息存放于user home目录。

    另外运行sbt的JVM参数也可以在sbtconfig.txt中指定。

    二、SBT命令行环境

    在命令行中进入工程目录,输入sbt,进入sbt的命令行。(这里建议进入工程目录再运行sbt命令。)

    wpsC46A.tmp

    注意:第一次使用sbt命令,程序会去下载所需要的jar包。整个过程需要很长时间,要耐心等待。当窗口中出现">"提示符,则说明sbt已经成功启动。下载完成后,显示如下图:

    wpsC49A.tmp

    sbt命令

    帮助命令 help

    wpsC4AB.tmp

    查看命令的详细帮助文档

    wpsC4AC.tmp

    wpsC4BC.tmp

     

    显示项目配置 show

    show name :查看当前项目的名字。

    show libraryDependencies :查看当前项目依赖的库。

     

    使用Scala控制台 console

    输入console回车,会在当前会话内启动一个REPL。sbt会加载当前项目依赖的全部jar包和当前的代码。即可以在这个解释器里实验你的半成品。

    因为依赖的jar包也都被加载了,所以对于那些你可能还不熟悉的第三方库,你有可以在console里玩个痛快!

     

    运行Scala程序 run

    若项目有个对象带有方法(或者对象继承了 App 品质(trait)),那么可以通过输入 run 在 sbt 中运行代码。

    在 sbt 发现有多个 main 方法时,它会询问你想执行哪一个,输入对应的序号即可。

    > run
    [warn] Multiple main classes detected. Run 'show discoveredMainClasses' to see the list
     
    Multiple main classes detected, select one to run:
     
    [1] KafkaWordCount
    [2] LocalCountWord1
    [3] LocalCountWord2
    [4] MasterCountWord1
    [5] MasterCountWord2
     
    Enter number: 1 
     
    [info] Running KafkaWordCount
     

    三、使用SBT构建项目

    在项目目录下创建project目录。

    wpsC4BD.tmp

    hello-sbt是项目目录。project是其子目录。 

    在project目录中创建build.properties文件。在文件中写入使用sbt的版本。若本机没有相应的版本,sbt会自动下载需要的版本。(本机使用当前最新sbt版本0.13.15)

    hello-sbt/project/build.properties配置为:

    
    
    1. sbt.version=0.13.15

     在项目目录下,创建hello-sbt/build.sbt,填入相应的项目配置:

    
    
    1. name:="hello-sbt"
    2. organization:="sjq.sbt"
    3. version:="0.1"
    4. scalaVersion:="2.11.8"

    接着在命令行中,进入当前工程,使用sbt命令,当看见尖括号提示符,即表示创建成功。(注:第一次使用sbt需要等待很长时间去下载相应文件

    wpsC4D0.tmp

    sbt-0.13.15资源库离线包下载路径(已经下载好sbt、sbteclipse、assembly所需支持包),下载地址:链接:http://pan.baidu.com/s/1pLluQG7 密码:0m77

    四、下载sbteclipse、sbt-assembly插件

     

    添加sbteclipse、sbt-assembly(集成打包jar包插件)

    在工程目录的project目录下创建hello-sbt/project/plugins.sbt,其中添加插件内容。

    
    
    1. addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")
    2. addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.13.0")

    执行reload命令

    wpsC4D2.tmp

    接着直接执行eclipse命令,即可生成eclipse项目文件。 

    在eclipse中导入工程即可:

    wpsC4D3.tmp

    如果没有创建src目录,手动创建如下目录,然后在重新运行eclipse命令即可。

    src/main/scala

    src/main/java

    src/main/resources

    src/test/scala

    src/test/scala

    src/test/resources 

    项目导入到Eclipse中显示如下:

    wpsC4E4.tmp

    若发现src目录下没有resources可以尝试手动创建,也可以在build.sbt中添加如下配置。

    EclipseKeys.createSrc := EclipseCreateSrc.Default + EclipseCreateSrc.Resource

    总之很简单。 

    五、SBT与Scala程序

    编写HelloSBT程序。

    HelloSBT.scala

    
    
    1. package sjb
    2.  
    3. object HelloSBT{
    4.     def main(args:Array[String]): Unit={
    5.         println("Hello SBT !!!")
    6.     }
    7. }

    在src/main/scala中写入HelloSBT程序,生成的eclipse项目如下:wpsC4E5.tmp

    使用sbt编译程序

    在sbt命令行下输入compile

    wpsC4F5.tmp

     使用sbt运行程序

    在sbt命令行下输入run

    wpsC4F6.tmp

    六、sbt  assembly打包依赖包

     
     
    hello-sbt/bulid.sbt :
    
    
    1. name:="hello-sbt"
    2. organization:="sjq.sbt"
    3. version:="0.1-SNAPSHOT"
    4. scalaVersion:="2.11.8"
     
    hello-sbt/project/bulid.properties :
    
    
    1. sbt.version=0.13.15
    hello-sbt/project/plugins.sbt :
    
    
    1. addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")
    2. addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.13.0")
    进入命令行:输入 : sbt
    >eclipse
    >compile
    >run
     
    >assembly 命令进行统一打包(包括依赖包)
    生成的jar包会把工程所依赖的jar包全部打包。
     

    七、sbt添加第三方依赖包

    添加依赖包,要添加一个第三方库的依赖,直接将jar包放到工程lib目录下:
     
     
    再执行“六、sbt  assembly打包依赖包”,即可将第三方依赖jar包打包。

    八、执行assembly命令报java.lang.OutOfMemoryError

    需要给工程打个jar包,到对应的目录下,执行命令行参数:
    
    
    1. >sbt 
    2. >assembly  
    堆栈溢出
    出现错误:Java.lang.StackOverflowError
    对于这个溢出,需要更改stack的大小,找到sbt的配置文件:sbtconfig.txt,添加内容:
    
    
    1. -Xss2m 

     
    内存溢出,出现错误:java.lang.OutOfMemoryError,常见的内存溢出现象,添加配置信息:
    
    
    1. -Xms64m  
    2. -Xmx500m  
    大小可以自行更改。
    sbt/conf/sbtconfig.txt配置信息一览
    
    
    1. # Set the java args to high
    2. -Xms640m  
    3. -Xmx5000m  
    4. -Xss20m  
    5. -XX:PermSize=1000M  
    6. -XX:MaxNewSize=2000m  
    7. -XX:MaxPermSize=4000m 
    8.  
    9. # Set the extra SBT options
    10. -Dsbt.log.format=true
    11. -Dfile.encoding=UTF8
    12. -Dsbt.boot.directory=d:/sbt-repository/boot/
    13. -Dsbt.ivy.home=d:/sbt-repository/

    九、 sbt发布assembly解决jar包冲突问题

    在项目工程的bulid.sbt配置文件,添加如下配置:

    
    
    1. mergeStrategy in assembly <<= (mergeStrategy in assembly) { mergeStrategy => {  
    2.  case entry => {  
    3.    val strategy = mergeStrategy(entry)  
    4.    if (strategy == MergeStrategy.deduplicate) MergeStrategy.first  
    5.    else strategy  
    6.  }  
    7. }}  

    hello-sbt/bulid.sbt的完整配置如下:

    
    
    1. name:="hello-sbt"
    2. organization:="sjq.sbt"
    3. version:="0.1"
    4. scalaVersion:="2.11.8"
    5. EclipseKeys.createSrc := EclipseCreateSrc.Default + EclipseCreateSrc.Resource
    6.  
    7. mergeStrategy in assembly <<= (mergeStrategy in assembly) { mergeStrategy => {  
    8.  case entry => {  
    9.    val strategy = mergeStrategy(entry)  
    10.    if (strategy == MergeStrategy.deduplicate) MergeStrategy.first  
    11.    else strategy  
    12.  }  
    13. }}  

    参考资料:

    http://www.cnblogs.com/shijiaqi1066/p/5103735.html

    http://wiki.jikexueyuan.com/project/sbt-getting-started/build-define.html

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

  • 相关阅读:
    做题总结
    关于SQLSERVER中用SQL语句查询的一些个人理解
    关于SQLSERVER联合查询一点看法
    C#中怎样实现序列化和反序列化
    java内部类的使用
    C#抽象类
    匿名类
    Foreach能够循环的本质
    C#索引器
    深入了解接口的使用
  • 原文地址:https://www.cnblogs.com/yangcx666/p/8723895.html
Copyright © 2020-2023  润新知