前言:sbt是一个用scala写的构建工具,跟maven、gradle差不多,目前最新的版本是0.11。不过本文是讲sbt 0.7的使用方法,sbt继承了scala优良的不兼容传统,从0.7升级到0.10是完全不兼容的两个版本,虽然0.7已经基本没人用了,但还是有一些开源项目还没切换到0.11上。我这篇文章比较早就完成了,但因为各种原因现在才发出来。
sbt 0.7的项目地址是 http://code.google.com/p/simple-build-tool/,官方为了让大家尽快升级到0.10以上的版本,已经将这个地址里面大部分文档都删除了,目前要找到0.7的资料已经很难了,建议大家新项目还是直接用0.11。
先来看一下sbt(没有特殊说明的话,以下sbt都是指sbt 0.7)的配置结构,sbt使用maven的约定目录来放置项目文件,比如说src/main/java、src/main/resources等等,当然这是可以通过配置进行修改。而sbt本身的配置,是放在项目根目录下的project目录下,如果你见到一些scala的开源项目有个project目录不要觉得奇怪,那是sbt的配置。如果你的项目是多个子项目组成的,只需要在总的根目录下进行sbt配置即可,不需要像maven那样每个项目下配置pom.xml。
一般来说,sbt的配置有以下三个文件
/project/build.properties /project/build/MyProject.scala (文件名随意) /project/plugins/Plugins.scala (文件名随意)
第一个文件是项目的基本信息配置,这里一个范例
project.organization=org.sparkle project.name=myproject project.version=1.0-SNAPSHOT sbt.version=0.7.7 build.scala.versions=2.9.0-1
前三项对应maven里面的groupId、artifactId、version
后面两项分别定义项目所用的sbt和scala版本
第二个文件是主要的配置文件,得益于scala强大的描述能力,项目配置直接用实际的scala代码来编写,具体的含义直接看代码中的注释
import sbt._ class MyProject(info: ProjectInfo) extends ParentProject(info) { // 通过at方法定义的变量自动成为额外的jar下载路径 val mavenLocal = "Local Maven Repository" at "file://" + Path.userHome + "/.m2/repository" val central = "central" at "http://192.168.1.88:18081/nexus/content/groups/public/" // 定义项目路径名、使用的定义类(见下方)、依赖关系(这里web依赖core) lazy val myprojectCore = project("myproject-core", "myproject-core", new MyprojectCoreProject(_)) lazy val myprojectWeb = project("myproject-web", "myproject-web", new MyprojectWebProject(_), myprojectCore) // 通过类继承来定义通用配置 abstract class MyprojectBaseProject(info: ProjectInfo) extends DefaultProject(info) { // 编译选项 override def javaCompileOptions = super.javaCompileOptions ++ javaCompileOptions("-encoding", "utf8") // 直接调整ivy配置 override def ivyXML = <dependencies> <exclude module="commons-logging"/> </dependencies> // 直接定义一个sbt指令,如果用maven实现的话新建一个plugin项目啊 val deployPath = "target" / "deploy" val deployClean = task { FileUtilities.clean(deployPath, log) None } } // 以下的代码都是定义项目所依赖的类库 class MyprojectCoreProject(info: ProjectInfo) extends MyprojectBaseProject(info) { val springJdbc = "org.springframework" % "spring-jdbc" % "3.0.5.RELEASE" val springContextSupport = "org.springframework" % "spring-context-support" % "3.0.5.RELEASE" // runtime scope val mysqlConnectorJava = "mysql" % "mysql-connector-java" % "5.1.16" % "runtime" // test scope val junit = "junit" % "junit" % "4.8.2" % "test" } class MyprojectWebProject(info: ProjectInfo) extends MyprojectBaseProject(info) { val springWebmvc = "org.springframework" % "spring-webmvc" % "3.0.5.RELEASE" // provided scope val jetty6 = "org.mortbay.jetty" % "jetty" % "6.1.26" % "provided" } }
是不是比maven的pom.xml简洁非常多,而且还可以直接inline使用scala代码实现各种额外的功能,maven就要开一个plugin项目才能实现
第三个文件是插件配置,sbt支持插件,可以理解为maven中的插件,大致的写法跟上一个文件很类似
import sbt._ class Plugins(info: ProjectInfo) extends PluginDefinition(info) { //val junitInterface = "com.novocode" % "junit-interface" % "0.7" }