花了一下午時(shí)間,總算全部搞定。時(shí)間主要都花費(fèi)在下載jar包上,雖然開(kāi)了VPN還是下載慢,沒(méi)有VPN的話(huà),真心要奔潰的。這期間有太多坑了,所以寫(xiě)這篇文章, 一是記錄下,二是方便大家查閱。
本人的系統(tǒng)環(huán)境
為什么要說(shuō)系統(tǒng)環(huán)境呢?不同的環(huán)境有不同的設(shè)置方法,但看了這篇文章后,可以舉一反三,在其他環(huán)境設(shè)置也沒(méi)什么問(wèn)題。
- OS: OS X EI Capitan 10.11
- IDE: IntelliJ IDEA 14.1.5
- Java Version: 1.7.0_72
- Scala Version: 2.11.7
- SBT Version: 0.13.8
- Typesafe Activator Version: 1.3.6(完整版本,400多MB,包含很多庫(kù),不是minimal)
- Play Framework Version: 2.3.9(為什么不用最新的2.4.3,請(qǐng)耐心看完)
主要包括的內(nèi)容
- 修改SBT的目錄路徑,默認(rèn)值是user.home下的.sbt文件夾
- 修改ivy的目錄倉(cāng)庫(kù)地址,默認(rèn)值是user.home下的.ivy2文件夾
- 修改activator的目錄路徑,使用和SBT修改后的相同路徑,倉(cāng)庫(kù)地址同樣.這里要說(shuō)下activator是sbt的超集, 詳細(xì)說(shuō)明請(qǐng)點(diǎn)擊
- 使用IDEA時(shí),同樣使用修改后的sbt路徑和ivy倉(cāng)庫(kù)地址
- 使用activator ui,activator new,activator run命令
- 使用IDEA構(gòu)建play-scala的web項(xiàng)目
詳細(xì)說(shuō)明
先打個(gè)預(yù)防針,可能說(shuō)的會(huì)比較啰嗦,是為了把整個(gè)過(guò)程說(shuō)清楚,有不明白或疑問(wèn)的,請(qǐng)都留下你的評(píng)論,我會(huì)一一回復(fù)。
將下載的sbt-0.13.8.zip(大約1MB)解壓至你的目錄,進(jìn)入sbt-0.13.8目錄,可以看見(jiàn)2個(gè)文件夾,分別是bin和conf, 顯而易見(jiàn),bin目錄下的是可執(zhí)行文件,conf目錄下是配置文件。 用文本工具打開(kāi)bin目錄下的sbt,可以看到如下的聲明:
declare -r etc_sbt_opts_file="${sbt_home}/conf/sbtopts" declare -r win_sbt_opts_file="${sbt_home}/conf/sbtconfig.txt"
${sbt_home}是系統(tǒng)變量,就像java_home一樣,所以要先增加這個(gè)變量,否則就算修改了conf目錄下的配置文件,也是沒(méi)有效果的。 打開(kāi)終端,輸入命令 cd ~(進(jìn)入用戶(hù)目錄,個(gè)人習(xí)慣修改用戶(hù)目錄下的.bash_profile文件),vi .bash_profile, 新增如下:
SBT_HOME=/Users/zhujiajun/Work/sbt-0.13.8 export PATH=$SBT_HOME/bin:$PATH
第一行設(shè)置sbt_home,第二行可以方便使用sbt命令,當(dāng)然請(qǐng)?zhí)顚?xiě)你的實(shí)際地址,保存并退出,最后別忘了source .bash_profile,使修改的文件生效。 可以使用sbt -h,測(cè)試是否配置的生效了。
接著,就可以修改conf目錄下的配置文件了,修改sbtopts文件,文本工具打開(kāi)并修改,修改3個(gè)值就可以,如下:
# Path to global settings/plugins directory (default: ~/.sbt) # -sbt-dir ~/Work/sbt # Path to shared boot directory (default: ~/.sbt/boot in 0.11 series) # -sbt-boot ~/Work/sbt/boot # Path to local Ivy repository (default: ~/.ivy2) # -ivy ~/Work/ivy-repository
最后需要給bin目錄下的sbt賦予可執(zhí)行權(quán)限,chmod u+x sbt。 到這一步,在終端使用sbt相關(guān)命令的時(shí)候,都會(huì)使用指定的目錄。開(kāi)發(fā)的時(shí)候,還是要依賴(lài)IDE,后面就說(shuō)明如何在IDEA中也使用指定的目錄。
首先,打開(kāi)IDEA的Default Setting(注意不是”cmd+,”,Default Setting是全局默認(rèn)設(shè)置,而另外個(gè)For current project, 以后就不必為每個(gè)項(xiàng)目都設(shè)置一遍了),搜索SBT,SBT設(shè)置頁(yè)面最下面默認(rèn)設(shè)的是Bundled,我們選擇Custom,指定前面解壓出來(lái)的bin目錄下的sbt-launch.jar。
由于IDEA是通過(guò)sbt-launch.jar來(lái)操作sbt的,并不是sbt命令。所以前面修改的目錄不管用,還是會(huì)在用戶(hù)目錄下自動(dòng)創(chuàng)建.sbt和.ivy2文件夾。 我們把sbt-launch.jar解壓出來(lái),看看到底是什么造成的。jar包里有編譯好的class文件,其中在sbt目錄下有個(gè)sbt.boot.properties文件,這就是我們需要修改的, 先看下部分的配置信息:
[repositories] local typesafe-ivy-releases: https://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly maven-central [boot] directory: ${sbt.boot.directory-${sbt.global.base-${user.home}/.sbt}/boot/} [ivy] ivy-home: ${sbt.ivy.home-${user.home}/.ivy2/} checksums: ${sbt.checksums-sha1,md5} override-build-repos: ${sbt.override.build.repos-false} repository-config: ${sbt.repository.config-${sbt.global.base-${user.home}/.sbt}/repositories}
repositories是遠(yuǎn)程倉(cāng)庫(kù)地址,boot就是設(shè)置.sbt目錄,ivy設(shè)置.ivy2倉(cāng)庫(kù)目錄,最后有個(gè)repository-config,我們可以在修改后的sbt目錄下新建 repositories文件,填寫(xiě)訪(fǎng)問(wèn)速度快的倉(cāng)庫(kù)地址,會(huì)覆蓋默認(rèn)的repositories設(shè)置信息。另外sbt.boot.directory,sbt.ivy.home,sbt.repository.config 這些都是可配置的參數(shù)信息,相當(dāng)于不用修改這配置文件,設(shè)置參數(shù)就行,但我在IDEA中設(shè)置的時(shí)候不起作用,使用-Dsbt.boot.directory=/xxx/xxx, 誰(shuí)知道這種方式設(shè)置的請(qǐng)告知。最后修改后的如下:
[repositories] local typesafe-ivy-releases: https://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly maven-central [boot] directory: /Users/zhujiajun/Work/sbt/boot [ivy] ivy-home: /Users/zhujiajun/Work/ivy-repository checksums: ${sbt.checksums-sha1,md5} override-build-repos: ${sbt.override.build.repos-false} repository-config: /Users/zhujiajun/Work/sbt/repositories
針對(duì)在IDEA中設(shè)置不起作用的問(wèn)題,今天又查了下文檔,終于解決了.不知道和IDEA升級(jí)到15版本是否有關(guān)系,因?yàn)槲矣浀弥暗?4系列版本,也是這樣設(shè)置的,然而不起作用, 也有可能是我記錯(cuò)了. 在IDEA的設(shè)置菜單中Build Tools下的sbt,我設(shè)置了Launcher(sbt-launcher.jar)為Custom的,就是指定修改后的sbt-launcher.jar,然而在refresh sbt項(xiàng)目 的時(shí)候,IDEA會(huì)出現(xiàn)警告如下:
15:08:53 Resolver Indexer: Repository is absent or invalid: /Users/zhujiajun/.ivy2/cache
很明顯,說(shuō)默認(rèn)的倉(cāng)庫(kù)地址不存在或者無(wú)效的,然而Custom指定的sbt-launcher.jar中的sbt.boot.properties文件已經(jīng)修改過(guò)ivy-home了,沒(méi)起作用? 我猜測(cè)是IDEA裝了scala語(yǔ)言插件有關(guān)系,還是使用默認(rèn)的ivy倉(cāng)庫(kù)地址. 其實(shí)要解決也很簡(jiǎn)單,還是在Build Tools下的sbt設(shè)置,有一個(gè)JVM Options,可以設(shè)置堆大小,和其他的jvm參數(shù)(VM parameters),在這里設(shè)置就行了
-XX:MaxPermSize=384M //這是已有的默認(rèn)值 -Dsbt.ivy.home=/Users/zhujiajun/Work/ivy-repository //新加 -Dsbt.boot.directory=/Users/zhujiajun/Work/sbt/boot //新加
再refresh下項(xiàng)目,搞定.PS:在sbt設(shè)置的時(shí)候,建議勾上Download Sources選擇,這樣jar包sources會(huì)自動(dòng)下載到ivh倉(cāng)庫(kù)里.否則當(dāng)你打開(kāi)源碼包類(lèi)文件的時(shí)候, 根據(jù)IDEA提示再去下載sources,此時(shí)并不會(huì)下載在ivy倉(cāng)庫(kù)中,而會(huì)下載至用戶(hù)目錄下的.ideaLibSources/文件中.
下面給出repositories文件內(nèi)容,配置了OSC China的國(guó)內(nèi)倉(cāng)庫(kù),會(huì)優(yōu)先去這里下載,沒(méi)有的話(huà)去官方倉(cāng)庫(kù)下載,在下載jar的時(shí)候發(fā)現(xiàn),大多數(shù)jar包會(huì)去官方 倉(cāng)庫(kù)下載,一些常用的可以在OSC上下載到,畢竟OSC是maven倉(cāng)庫(kù)地址。
[repositories] local oschina nexus:http://maven.oschina.net/content/groups/public/ typesafe: http://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly maven-central sbt-plugins-repo: http://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext] play: http://private-repo.typesafe.com/typesafe/maven-releases/ sonatype-snapshots: https://oss.sonatype.org/content/repositories/snapshots typesafe-releases: https://repo.typesafe.com/typesafe/releases typesafe-ivy-releasez: https://repo.typesafe.com/typesafe/ivy-releases, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
最后一步,將修改后的sbt.boot.properties文件更新到j(luò)ar中,或者根據(jù)此配置文件重新打個(gè)jar包也可以。現(xiàn)在使用IDEA的時(shí)候,也會(huì)使用指定的目錄了。
sbt設(shè)置到此結(jié)束。接下來(lái)說(shuō)下基于play framework的設(shè)置。要使用play,就要下載typesafe-activator-1.3.6.zip,這是包含很多庫(kù)的。 同樣的操作,進(jìn)入解壓完成的目錄,解壓activator-launch-1.3.6.jar,修改sbt.boot.properties配置文件,更新jar。
使用./activator ui,可以啟動(dòng)服務(wù),頁(yè)面會(huì)自動(dòng)打開(kāi),地址是http://127.0.0.1:8888/home,有很多模版,可以選擇模版后指定想要的目錄生成。 現(xiàn)在使用./activator new命令來(lái)創(chuàng)建play-scala項(xiàng)目,第一步是根據(jù)模版選擇,一共有6個(gè)模版,如下:
Fetching the latest list of templates... Browse the list of templates: http://typesafe.com/activator/templates Choose from these featured templates or enter a template name: 1) minimal-akka-java-seed 2) minimal-akka-scala-seed 3) minimal-java 4) minimal-scala 5) play-java 6) play-scala (hit tab to see a list of all templates) >
輸入6,回車(chē),接著輸入項(xiàng)目名稱(chēng),會(huì)在當(dāng)前目錄下生成指定的項(xiàng)目。如想要方便的執(zhí)行activator命令,也需要配置系統(tǒng)變量, export PATH=/Users/zhujiajun/Work/activator-dist-1.3.6:$PATH,這樣就方便在哪個(gè)目錄都可以執(zhí)行命令了。
接著需要修改生成的項(xiàng)目,否則使用IDEA導(dǎo)入項(xiàng)目會(huì)提示很多錯(cuò)誤,我在解決一個(gè)后,又出現(xiàn)個(gè),如此循環(huán)。 首先修改根目錄下的build.sbt文件,修改scalaVersion為2.11.7,默認(rèn)好像是2.11.6。修改依賴(lài)庫(kù),將specs2這一行修改為 “org.specs2” %% “specs2” % “2.4.2”,最后注釋掉尾部的一句話(huà)routesGenerator := InjectedRoutesGenerator,這里要說(shuō)明下為什么, 這個(gè)依賴(lài)注入是play2.4的功能官方說(shuō)明 ,由于使用的是2.3.9,所以并不支持,否則導(dǎo)入IDEA的時(shí)候又會(huì)提示錯(cuò)誤信息了。哪為什么不使用2.4.3最新版本呢?因?yàn)槲沂褂玫氖莏ava1.7版本, play 2.4.3不支持java1.6和1.7了,否則導(dǎo)入IDEA構(gòu)建的時(shí)候,就會(huì)提示異常信息,如下:
java.lang.UnsupportedClassVersionError: play/runsupport/classloader/ApplicationClassLoaderProvider : Unsupported major.minor version 52.0
另附上一段官方說(shuō)明:”The support for Java 6 and Java 7 was dropped and Play 2.4 now requires Java 8.”,詳細(xì)官方說(shuō)明
build.sbt修改完成.然后進(jìn)入project目錄修改plugins.sbt文件,將第一行的play插件依賴(lài)的版本號(hào)修改為2.3.9,默認(rèn)是2.4.3,原因之前已經(jīng)說(shuō)明了。
// The Play plugin addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.9")
使用IDEA導(dǎo)入項(xiàng)目,要等很長(zhǎng)時(shí)間,需要下載很多jar依賴(lài),導(dǎo)入完成后,將Application類(lèi)修改為object,默認(rèn)是class的,class是針對(duì)paly2.4版本的。
object Application extends Controller { def index = Action { Ok(views.html.index("Your new application is ready.")) }
最后進(jìn)入工程目錄,執(zhí)行activator run命令,訪(fǎng)問(wèn)http://localhost:9000/,看到頁(yè)面成功。
參考:
http://www.scala-sbt.org/0.13/tutorial/zh-cn/Manual-Installation.html http://www.scala-sbt.org/0.13/tutorial/zh-cn/Activator-Installation.htmlhttps://www.playframework.com/documentation/2.4.x/Migration24https://playframework.com/documentation/2.4.x/JavaDependencyInjection
原創(chuàng)文章轉(zhuǎn)載請(qǐng)注明出處:基于play-scala的sbt目錄和ivy倉(cāng)庫(kù)設(shè)置