Sbt的使用初步和用sbt插件生成eclipse工程


以前一直是用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中具體的配置


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM