Dec 302011
 

前言: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"
}

  3 Responses to “sbt 0.7”

  1. 优良的不兼容传统,嗯嗯,得像py一样针对2.5/2.7/3.1分别对待啊

    • 竟然scala 2.9和2.8编译出来的bytecode不兼容,这已经出离了我对jvm的认知了,而且准备出的2.10继续不兼容2.9

  2. 来顶博主了。

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">