花了一下午時間,總算全部搞定。時間主要都花費在下載jar包上,雖然開了VPN還是下載慢,沒有VPN的話,真心要奔潰的。這期間有太多坑了,所以寫這篇文章, 一是記錄下,二是方便大家查閱。
本人的系統環境
為什么要說系統環境呢?不同的環境有不同的設置方法,但看了這篇文章后,可以舉一反三,在其他環境設置也沒什么問題。
- 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,包含很多庫,不是minimal)
- Play Framework Version: 2.3.9(為什么不用最新的2.4.3,請耐心看完)
主要包括的內容
- 修改SBT的目錄路徑,默認值是user.home下的.sbt文件夾
- 修改ivy的目錄倉庫地址,默認值是user.home下的.ivy2文件夾
- 修改activator的目錄路徑,使用和SBT修改后的相同路徑,倉庫地址同樣.這里要說下activator是sbt的超集, 詳細說明請點擊
- 使用IDEA時,同樣使用修改后的sbt路徑和ivy倉庫地址
- 使用activator ui,activator new,activator run命令
- 使用IDEA構建play-scala的web項目
詳細說明
先打個預防針,可能說的會比較啰嗦,是為了把整個過程說清楚,有不明白或疑問的,請都留下你的評論,我會一一回復。
將下載的sbt-0.13.8.zip(大約1MB)解壓至你的目錄,進入sbt-0.13.8目錄,可以看見2個文件夾,分別是bin和conf, 顯而易見,bin目錄下的是可執行文件,conf目錄下是配置文件。 用文本工具打開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}是系統變量,就像java_home一樣,所以要先增加這個變量,否則就算修改了conf目錄下的配置文件,也是沒有效果的。 打開終端,輸入命令 cd ~(進入用戶目錄,個人習慣修改用戶目錄下的.bash_profile文件),vi .bash_profile, 新增如下:
SBT_HOME=/Users/zhujiajun/Work/sbt-0.13.8 export PATH=$SBT_HOME/bin:$PATH
第一行設置sbt_home,第二行可以方便使用sbt命令,當然請填寫你的實際地址,保存并退出,最后別忘了source .bash_profile,使修改的文件生效。 可以使用sbt -h,測試是否配置的生效了。
接著,就可以修改conf目錄下的配置文件了,修改sbtopts文件,文本工具打開并修改,修改3個值就可以,如下:
# 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賦予可執行權限,chmod u+x sbt。 到這一步,在終端使用sbt相關命令的時候,都會使用指定的目錄。開發的時候,還是要依賴IDE,后面就說明如何在IDEA中也使用指定的目錄。
首先,打開IDEA的Default Setting(注意不是”cmd+,”,Default Setting是全局默認設置,而另外個For current project, 以后就不必為每個項目都設置一遍了),搜索SBT,SBT設置頁面最下面默認設的是Bundled,我們選擇Custom,指定前面解壓出來的bin目錄下的sbt-launch.jar。
由于IDEA是通過sbt-launch.jar來操作sbt的,并不是sbt命令。所以前面修改的目錄不管用,還是會在用戶目錄下自動創建.sbt和.ivy2文件夾。 我們把sbt-launch.jar解壓出來,看看到底是什么造成的。jar包里有編譯好的class文件,其中在sbt目錄下有個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是遠程倉庫地址,boot就是設置.sbt目錄,ivy設置.ivy2倉庫目錄,最后有個repository-config,我們可以在修改后的sbt目錄下新建 repositories文件,填寫訪問速度快的倉庫地址,會覆蓋默認的repositories設置信息。另外sbt.boot.directory,sbt.ivy.home,sbt.repository.config 這些都是可配置的參數信息,相當于不用修改這配置文件,設置參數就行,但我在IDEA中設置的時候不起作用,使用-Dsbt.boot.directory=/xxx/xxx, 誰知道這種方式設置的請告知。最后修改后的如下:
[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
針對在IDEA中設置不起作用的問題,今天又查了下文檔,終于解決了.不知道和IDEA升級到15版本是否有關系,因為我記得之前的14系列版本,也是這樣設置的,然而不起作用, 也有可能是我記錯了. 在IDEA的設置菜單中Build Tools下的sbt,我設置了Launcher(sbt-launcher.jar)為Custom的,就是指定修改后的sbt-launcher.jar,然而在refresh sbt項目 的時候,IDEA會出現警告如下:
15:08:53 Resolver Indexer: Repository is absent or invalid: /Users/zhujiajun/.ivy2/cache
很明顯,說默認的倉庫地址不存在或者無效的,然而Custom指定的sbt-launcher.jar中的sbt.boot.properties文件已經修改過ivy-home了,沒起作用? 我猜測是IDEA裝了scala語言插件有關系,還是使用默認的ivy倉庫地址. 其實要解決也很簡單,還是在Build Tools下的sbt設置,有一個JVM Options,可以設置堆大小,和其他的jvm參數(VM parameters),在這里設置就行了
-XX:MaxPermSize=384M //這是已有的默認值 -Dsbt.ivy.home=/Users/zhujiajun/Work/ivy-repository //新加 -Dsbt.boot.directory=/Users/zhujiajun/Work/sbt/boot //新加
再refresh下項目,搞定.PS:在sbt設置的時候,建議勾上Download Sources選擇,這樣jar包sources會自動下載到ivh倉庫里.否則當你打開源碼包類文件的時候, 根據IDEA提示再去下載sources,此時并不會下載在ivy倉庫中,而會下載至用戶目錄下的.ideaLibSources/文件中.
下面給出repositories文件內容,配置了OSC China的國內倉庫,會優先去這里下載,沒有的話去官方倉庫下載,在下載jar的時候發現,大多數jar包會去官方 倉庫下載,一些常用的可以在OSC上下載到,畢竟OSC是maven倉庫地址。
[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文件更新到jar中,或者根據此配置文件重新打個jar包也可以。現在使用IDEA的時候,也會使用指定的目錄了。
sbt設置到此結束。接下來說下基于play framework的設置。要使用play,就要下載typesafe-activator-1.3.6.zip,這是包含很多庫的。 同樣的操作,進入解壓完成的目錄,解壓activator-launch-1.3.6.jar,修改sbt.boot.properties配置文件,更新jar。
使用./activator ui,可以啟動服務,頁面會自動打開,地址是http://127.0.0.1:8888/home,有很多模版,可以選擇模版后指定想要的目錄生成。 現在使用./activator new命令來創建play-scala項目,第一步是根據模版選擇,一共有6個模版,如下:
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,回車,接著輸入項目名稱,會在當前目錄下生成指定的項目。如想要方便的執行activator命令,也需要配置系統變量, export PATH=/Users/zhujiajun/Work/activator-dist-1.3.6:$PATH,這樣就方便在哪個目錄都可以執行命令了。
接著需要修改生成的項目,否則使用IDEA導入項目會提示很多錯誤,我在解決一個后,又出現個,如此循環。 首先修改根目錄下的build.sbt文件,修改scalaVersion為2.11.7,默認好像是2.11.6。修改依賴庫,將specs2這一行修改為 “org.specs2” %% “specs2” % “2.4.2”,最后注釋掉尾部的一句話routesGenerator := InjectedRoutesGenerator,這里要說明下為什么, 這個依賴注入是play2.4的功能官方說明 ,由于使用的是2.3.9,所以并不支持,否則導入IDEA的時候又會提示錯誤信息了。哪為什么不使用2.4.3最新版本呢?因為我使用的是java1.7版本, play 2.4.3不支持java1.6和1.7了,否則導入IDEA構建的時候,就會提示異常信息,如下:
java.lang.UnsupportedClassVersionError: play/runsupport/classloader/ApplicationClassLoaderProvider : Unsupported major.minor version 52.0
另附上一段官方說明:”The support for Java 6 and Java 7 was dropped and Play 2.4 now requires Java 8.”,詳細官方說明
build.sbt修改完成.然后進入project目錄修改plugins.sbt文件,將第一行的play插件依賴的版本號修改為2.3.9,默認是2.4.3,原因之前已經說明了。
// The Play plugin addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.9")
使用IDEA導入項目,要等很長時間,需要下載很多jar依賴,導入完成后,將Application類修改為object,默認是class的,class是針對paly2.4版本的。
object Application extends Controller { def index = Action { Ok(views.html.index("Your new application is ready.")) }
最后進入工程目錄,執行activator run命令,訪問http://localhost:9000/,看到頁面成功。
參考:
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
原創文章轉載請注明出處:基于play-scala的sbt目錄和ivy倉庫設置