以前一直是用maven去管理java项目,现在开始写scala项目了
但是在scala-ide中去编译scala项目和sbt的区别一直没弄清楚
受到文章:
http://my.oschina.net/yjwxh/blog/601566
的启发,查了相关的资料
sbt官网是http://www.scala-sbt.org/
官网的文档对中文特别友好,有中文版本的,但是看了一遍感觉很难接受这么复杂的配置方法
sbt是一种构建工具,在eclipse-ide中并没有集成
下载安装msi之后,在默认路径出现了/bin和/conf两个文件夹,添加到path中
在cmd中运行sbt之后会下载很多的jar包,这点非常不友好,第一次我以为出错了
第二次,运行了一夜,终于好了。
第一个小例子:
新建一个hello文件夹
新建一个hw.scala文件
object Hi {
def main(args: Array[String]) = println("Hi!")
}
进入特定的路径
运行sbt 会在hello文件夹下生成target文件夹
运行run
可以得到最简单的helloworld程度的执行
第一次修改第一个例子:
hello文件夹中添加一个文件build.sbt
lazy val root = (project in file(".")).
settings(
name:="hello",
version:="1.0",
scalaVersion:="2.11.8"
)
基本的构建设置都是放在根目录下的这个配置文件里面的
至少要有的是name 和 version属性
当然可以指定sbt的版本,在/hello/project/build.properties中输入
sbt.version=0.13.11
强制指定使用的sbt的版本,虽然各个sbt的版本兼容,但是官方还是建议指定
sbt使用的项目的目录是和maven相似的
构建出来的:编译的classes,打包的jars,托管文件,chches和文档都默认存在在target目录中
下面是进入sbt之后可以执行的选项
clean 删除targt目录下的文件
compile 编译源文件
test 编译运行所有的测试
console 进入一个包含classpath的解析器,quit或者ctrl+z退出
run <参数> 在和sbt所处的同一个虚拟机上执行项目的main class
package 将resources中文件和scala,java中的class文件打成jar包
help <命令> 显示帮助
reload 重新构建
sbt clean compile "testOnly TestA TestB"
首先执行清理,然后执行编译,最后是针对的testOnly和它的两个参数
一个比较高大上的命令就是
~compile
可以在更改源文件的同时自动的运行编译,就是一边改代码,结果就出来了(两个显示器的时候)
构建定义的三种风格:
多工程.sbt构建定义
bare.sbt构建定义
.scala构建定义
每个工程都有一些不可变的映射表来描述工程
map-key
第二个例子:
lazy val commonSettings = Seq(
organization := "com.example",
version := "0.1.0",
scalaVersion := "2.11.7"
)
lazy val root = (project in file(".")).
settings(commonSettings: _*).
settings(
name := "hello"
)
左边的name,version,scalaVersion,都是keys
一个key是一个SettingKey[T],或者TaskKey[T],或者InputKey[T]的实例
可以按照java语法设置这些key
lazy val root = (project in file(".")).
settings(
name :=("hello")
)
SettingKey[T]:一个key对应着只计算一次的value,加载项目的时候计算,然后一直保存着
TaskKey[T]:一个key对应着task的value,每次都会重新计算,可能存在潜在的副作用
InputKey[T]:一个key对应一个可以接收命令行参数的task
内置的keys:
内置的keys实际上是对象Keys的字段
build.sbt会隐式包含import sbt.keys._
所以可以通过name取到sbt.keys.name
自定义的keys:
通过上面的三种方法可以创建自定义的keys
例如:lazy val hello = taskKey[unit]("一个task示例")
给一个新的task也就是hello定义一个key
也就是说除了.sbt之外,cals和defs也可以对工程进行设置,与配置的位置是无关的
这里的lazy val而不是val可以避免初始化顺序的问题
添加第三方依赖库有两种方式:
将jar文件放入lib/中
在build.sbt中添加依赖
例子:
val derby = "org.apache.derby" % "derby" % "10.4.1.3"
lazy val commonSettings = Seq(
organization := "com.example",
version := "0.1.0",
scalaVersion := "2.11.7"
)
lazy val root = (project in file(".")).
settings(commonSettings: _*).
settings(
name := "hello",
libraryDependencies += derby
)
其中的+=好理解
%方法是用来从字符串构造Ivy模块ID的
下面的文档描述的就有点复杂了不看了
https://github.com/typesafehub/sbteclipse
针对比0.13版本高的sbt可以创建eclipse使用的工程文件目录
将这个插件用到sbt中有两种方法:
在~/.sbt/0.13/plugins/plugins.sbt中配置
在项目目录下去配置:project_dir/project/plugins.sbt
对最新版的配置的语法是:
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")
然后在命令行使用eclipse命令就可以生成一个目录结构,可以作为eclipse工程导入
例如:新建如下的目录结构
PS D:\javaweb_workspace\SCALA\sbt_eclipse_test> tree /f .
D:\JAVAWEB_WORKSPACE\SCALA\SBT_ECLIPSE_TEST
│ build.sbt
│
└─project
plugins.sbt
PS D:\javaweb_workspace\SCALA\sbt_eclipse_test> sbt
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
[info] Loading global plugins from C:\Users\kongchung\.sbt\0.13\plugins
[info] Loading project definition from D:\javaweb_workspace\SCALA\sbt_eclipse_test\project
[info] Updating {file:/D:/javaweb_workspace/SCALA/sbt_eclipse_test/project/}sbt_eclipse_test-build...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Set current project to sbt_eclipse_test (in build file:/D:/javaweb_workspace/SCALA/sbt_eclipse_test/)
> eclipse
[info] About to create Eclipse project files for your project(s).
[info] Updating {file:/D:/javaweb_workspace/SCALA/sbt_eclipse_test/}sbt_eclipse_test...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Successfully created Eclipse project files for project(s):
[info] sbt_eclipse_test
> exit
PS D:\javaweb_workspace\SCALA\sbt_eclipse_test> tree /f .
D:\JAVAWEB_WORKSPACE\SCALA\SBT_ECLIPSE_TEST
│ .classpath
│ .project
│ build.sbt
│
├─.settings
│ org.eclipse.core.resources.prefs
│ org.scala-ide.sdt.core.prefs
│
├─project
│ │ plugins.sbt
│ │
│ ├─project
│ │ └─target
│ │ └─config-classes
│ │ $0b5cfab2a23c8f87aa49$.class
│ │ $0b5cfab2a23c8f87aa49.cache
│ │ $0b5cfab2a23c8f87aa49.class
│ │
│ └─target
│ ├─config-classes
│ ├─resolution-cache
│ │ ├─default
│ │ │ └─sbt_eclipse_test-build
│ │ │ └─scala_2.10
这个例子的参考文献:
http://www.tuicool.com/articles/f26Bjq
我得到的这个目录还缺少一些文件目录
这些设置都可以在build.sbt中具体的配置