1. 程式人生 > >scala eclipse sbt 應用程式開發

scala eclipse sbt 應用程式開發

    由於Scala有一個比較完備的Eclipse IDE(Scala IDE for Eclipse), 對於不想從eclipse遷移到Iea平臺的Dev來說,如何方便、快速、有效得在Eclipse下編譯打包開發Scala應用程式尤為重要。Sbt是類似Maven的一個構建工具,我們將使用它來構建釋出程式。

    本文會介紹搭建Eclipse開發Scala應用程式的一般步驟,並結合例項演示sbt工具在eclipse裡是如何建立專案檔案,和編譯打包部署程式的。

    這裡做個備忘,也為初學者少走彎路而做出點小小的貢獻。

  一、環境準備:

   以上列出均為開發時必須的軟體環境:

   我的,Scala版本是2.10.3, Sbt版本是0.13

  二、sbt生成scala eclipse專案:

     我們想要在Eclipse裡開發scala應用並符合sbt釋出程式的檔案結構(類似Maven結構),除了手工建立檔案結構,還可以採用sbt eclipse的配置方法。

    2.1、新增sbt eclipse外掛

     有2種配置方式:

     一種是在~/.sbt/0.13/plugins//build.sbt 裡配置addPlugin,這種做法是全域性的外掛,即對本機所有sbt專案均使用。

    另一種是每個專案不一樣的plugins,則是在每個專案跟目錄下project/plugins.sbt裡進行外掛配置。

    比如test_sbt:

[email protected]:~/workspace/test_sbt$ pwd
/home/victor/workspace/test_sbt
victor-ubuntu:~/workspace/test_sbt$ tree .
.
├── build.sbt
└── project
    └── plugins.sbt

1 directory, 2 files
    plugins.sbt裡面內容配置,新增外掛:
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.4.0")
  

   2.2、生成eclipse專案檔案

   然後進入到根目錄sbt,成功進入sbt,執行eclipse命令生成eclipse的.classpath等eclipse相關檔案:

[email protected]:~/workspace/test_sbt$ ll
total 28
drwxrwxr-x 5 victor victor 4096  8月  4 00:38 ./
drwxrwxr-x 8 victor victor 4096  8月  4 00:28 ../
-rw-rw-r-- 1 victor victor    0  8月  4 00:38 build.sbt
-rw-rw-r-- 1 victor victor  589  8月  4 00:38 .classpath
drwxrwxr-x 4 victor victor 4096  8月  4 00:38 project/
-rw-rw-r-- 1 victor victor  362  8月  4 00:38 .project
drwxrwxr-x 4 victor victor 4096  8月  4 00:38 src/
drwxrwxr-x 4 victor victor 4096  8月  4 00:38 target/
  可以看到和maven的目錄結構是相似的:
[email protected]:~/workspace/test_sbt$ tree src
src
├── main
│   ├── java
│   └── scala
└── test
    ├── java
    └── scala

  發現沒有resouces目錄:

  在跟目錄的build.sbt裡新增:

EclipseKeys.createSrc := EclipseCreateSrc.Default + EclipseCreateSrc.Resource
   再執行sbt eclipse 
[email protected]:~/workspace/test_sbt$ tree src/
src/
├── main
│   ├── java
│   ├── resources
│   └── scala
└── test
    ├── java
    ├── resources
    └── scala

   2.3、匯入Eclipse中

   我們進入Eclipse,利用匯入嚮導的import existing project into workspace這一項進行匯入。

  

    至此,我們的專案結構搭建完成,可以像開發java maven專案一樣的開發scala sbt專案了。

   三、開發與部署

    下面準備用一個實際例子演示在Scala裡開發的一般步驟,最近用到scala裡的json,就用json4s這個json lib來開發一個解析json的例子,json4s地址:https://github.com/json4s/json4s

    3.1、新增依賴

     我們如果想使用第三方的類,就需要新增依賴關係,和GAV座標,這個再熟悉不過,我們需要編輯根目錄下的build.sbt檔案,新增依賴:

     這裡name,version,scalaVersion要注意每個間隔一行,其它的也是,不然會出錯。

     libraryDependencies是新增依賴的地方:我們新增2個。

    resolvers是倉庫地址,這裡配置了多個。

   如下:

name := "shengli_test_sbt"

version := "1.0"

scalaVersion := "2.10.3"

EclipseKeys.createSrc := EclipseCreateSrc.Default + EclipseCreateSrc.Resource

libraryDependencies ++= Seq(
  "org.json4s" %% "json4s-native" % "3.2.10",
  "org.json4s" %% "json4s-jackson" % "3.2.10"
)

resolvers ++= Seq(
      // HTTPS is unavailable for Maven Central
      "Maven Repository"     at "http://repo.maven.apache.org/maven2",
      "Apache Repository"    at "https://repository.apache.org/content/repositories/releases",
      "JBoss Repository"     at "https://repository.jboss.org/nexus/content/repositories/releases/",
      "MQTT Repository"      at "https://repo.eclipse.org/content/repositories/paho-releases/",
      "Cloudera Repository"  at "http://repository.cloudera.com/artifactory/cloudera-repos/",
      // For Sonatype publishing
      // "sonatype-snapshots"   at "https://oss.sonatype.org/content/repositories/snapshots",
      // "sonatype-staging"     at "https://oss.sonatype.org/service/local/staging/deploy/maven2/",
      // also check the local Maven repository ~/.m2
      Resolver.mavenLocal
)
    再次執行sbt eclipse,則依賴的jar包會自動載入到classpath:

      

    3.2、測試程式

    一個簡單的解析Json的程式,程式很簡單,這裡就不解釋了。

package com.shengli.json
import org.json4s._
import org.json4s.JsonDSL._
import org.json4s.jackson.JsonMethods._

object JsonSbtTest extends Application{
	

  case class Winner(id: Long, numbers: List[Int])
  case class Lotto(id: Long, winningNumbers: List[Int], winners: List[Winner], drawDate: Option[java.util.Date])

  val winners = List(Winner(23, List(2, 45, 34, 23, 3, 5)), Winner(54, List(52, 3, 12, 11, 18, 22)))
  val lotto = Lotto(5, List(2, 45, 34, 23, 7, 5, 3), winners, None)
  val json =
    ("lotto" ->
      ("lotto-id" -> lotto.id) ~ 
      ("winning-numbers" -> lotto.winningNumbers) ~
      ("draw-date" -> lotto.drawDate.map(_.toString)) ~
      ("winners" ->
        lotto.winners.map { w =>
          (("winner-id" -> w.id) ~
           ("numbers" -> w.numbers))}))

  println(compact(render(json)))
  println(pretty(render(json)))
}

    至此我們在eclipse能執行Run as Scala Application,但是如何加依賴打包釋出呢?

    3.3、Assembly

   還記得Spark裡面的assembly嗎?那個就是釋出用的,sbt本身支援的clean compile package之類的命令,但是帶依賴的one jar打包方式還是assembly比較成熟。

clean Deletes all generated files (in the target directory).
compile Compiles the main sources (in src/main/scala and src/main/java directories).
test Compiles and runs all tests.
console Starts the Scala interpreter with a classpath including the compiled sources and all dependencies. To return to sbt, type:quit, Ctrl+D (Unix), or Ctrl+Z (Windows).
run <argument>* Runs the main class for the project in the same virtual machine as sbt.
package Creates a jar file containing the files in src/main/resources and the classes compiled fromsrc/main/scala andsrc/main/java.
help <command> Displays detailed help for the specified command. If no command is provided, displays brief descriptions of all commands.
reload Reloads the build definition (build.sbt, project/*.scala, project/*.sbt files). Needed if you change the build definition.

   Assembly

   Assembly是作為一種外掛的,所以要在project下面的plugins.sbt裡面配置,至此plugins.sbt檔案裡內容如下:

resolvers += Resolver.url("artifactory", url("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases"))(Resolver.ivyStylePatterns)

resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"

addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.4.0")

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")

    除了外掛的配置之外,還需要配置跟目錄下build.sbt,支援assembly,在檔案頭部加入:
import AssemblyKeys._
assemblySettings
   至此build.sbt檔案內容如下:
import AssemblyKeys._
assemblySettings

name := "shengli_test_sbt"

version := "1.0"

scalaVersion := "2.10.3"

EclipseKeys.createSrc := EclipseCreateSrc.Default + EclipseCreateSrc.Resource

libraryDependencies ++= Seq(
  "org.json4s" %% "json4s-native" % "3.2.10",
  "org.json4s" %% "json4s-jackson" % "3.2.10"
)

resolvers ++= Seq(
      // HTTPS is unavailable for Maven Central
      "Maven Repository"     at "http://repo.maven.apache.org/maven2",
      "Apache Repository"    at "https://repository.apache.org/content/repositories/releases",
      "JBoss Repository"     at "https://repository.jboss.org/nexus/content/repositories/releases/",
      "MQTT Repository"      at "https://repo.eclipse.org/content/repositories/paho-releases/",
      "Cloudera Repository"  at "http://repository.cloudera.com/artifactory/cloudera-repos/",
      // For Sonatype publishing
      // "sonatype-snapshots"   at "https://oss.sonatype.org/content/repositories/snapshots",
      // "sonatype-staging"     at "https://oss.sonatype.org/service/local/staging/deploy/maven2/",
      // also check the local Maven repository ~/.m2
      Resolver.mavenLocal
)

   執行sbt assembly命令進行釋出:
> assembly
[info] Updating {file:/home/victor/workspace/test_sbt/}test_sbt...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Compiling 1 Scala source to /home/victor/workspace/test_sbt/target/scala-2.10/classes...
[warn] there were 1 deprecation warning(s); re-run with -deprecation for details
[warn] one warning found
[info] Including: scala-compiler-2.10.0.jar
[info] Including: scala-library-2.10.3.jar
[info] Including: json4s-native_2.10-3.2.10.jar
[info] Including: json4s-core_2.10-3.2.10.jar
[info] Including: json4s-ast_2.10-3.2.10.jar
[info] Including: paranamer-2.6.jar
[info] Including: scalap-2.10.0.jar
[info] Including: jackson-databind-2.3.1.jar
[info] Including: scala-reflect-2.10.0.jar
[info] Including: jackson-annotations-2.3.0.jar
[info] Including: json4s-jackson_2.10-3.2.10.jar
[info] Including: jackson-core-2.3.1.jar
[info] Checking every *.class/*.jar file's SHA-1.
[info] Merging files...
[warn] Merging 'META-INF/NOTICE' with strategy 'rename'
[warn] Merging 'META-INF/LICENSE' with strategy 'rename'
[warn] Merging 'META-INF/MANIFEST.MF' with strategy 'discard'
[warn] Merging 'rootdoc.txt' with strategy 'concat'
[warn] Strategy 'concat' was applied to a file
[warn] Strategy 'discard' was applied to a file
[warn] Strategy 'rename' was applied to 2 files
[info] SHA-1: d4e76d7b55548fb2a6819f2b94e37daea9421684
[info] Packaging /home/victor/workspace/test_sbt/target/scala-2.10/shengli_test_sbt-assembly-1.0.jar ...
[info] Done packaging.
[success] Total time: 39 s, completed Aug 4, 2014 1:26:11 AM
  我們發現檔案釋出到了/home/victor/workspace/test_sbt/target/scala-2.10/shengli_test_sbt-assembly-1.0.jar

  那我們來執行一下,看是否成功:

  執行:

java -cp /home/victor/workspace/test_sbt/target/scala-2.10/shengli_test_sbt-assembly-1.0.jar com.shengli.json.JsonSbtTest

[email protected]:~/workspace/test_sbt$ java -cp /home/victor/workspace/test_sbt/target/scala-2.10/shengli_test_sbt-assembly-1.0.jar com.shengli.json.JsonSbtTest
{"lotto":{"lotto-id":5,"winning-numbers":[2,45,34,23,7,5,3],"winners":[{"winner-id":23,"numbers":[2,45,34,23,3,5]},{"winner-id":54,"numbers":[52,3,12,11,18,22]}]}}
{
  "lotto" : {
    "lotto-id" : 5,
    "winning-numbers" : [ 2, 45, 34, 23, 7, 5, 3 ],
    "winners" : [ {
      "winner-id" : 23,
      "numbers" : [ 2, 45, 34, 23, 3, 5 ]
    }, {
      "winner-id" : 54,
      "numbers" : [ 52, 3, 12, 11, 18, 22 ]
    } ]
  }
}

   證實發布的結果是成功的。

四、總結

   本文介紹了在Eclipse裡利用Sbt構建開發Scala程式的一般步驟,並用例項講解了整個流程。

   用sbt eclipse外掛生成sbt檔案目錄結構,sbt eclipse命令來生成更新jar包依賴。

   用assebly外掛對scala應用進行打包釋出。  

——EOF——

相關推薦

scala eclipse sbt 應用程式開發

    由於Scala有一個比較完備的Eclipse IDE(Scala IDE for Eclipse), 對於不想從eclipse遷移到Iea平臺的Dev來說,如何方便、快速、有效得在Eclipse下編譯打包開發Scala應用程式尤為重要。Sbt是類似Maven的一個構

Spark應用程式開發引數調優深入剖析-Spark商業調優實戰

本套系列部落格從真實商業環境抽取案例進行總結和分享,並給出Spark商業應用實戰指導,請持續關注本套部落格。版權宣告:本套Spark商業應用實戰歸作者(秦凱新)所有,禁止轉載,歡迎學習。 Spark商業應用實戰-Spark資料傾斜案例測試及調優準則深入剖析 Spark商業應用實戰-Spark資源

Windows應用程式開發

Windows窗體應用程式開發:WinForm、桌面應用程式,有可執行檔案(.exe)即安裝包。是一種C/S(客戶機/伺服器)架構應用程式 1.Windows窗體應用程式,用視覺化的窗體和控制元件生成豐富介面的,可互動操作的應用程式。從工具箱選擇相應控制元件,拖曳到窗體介面,通過設定其屬性,佈局外觀。雙擊控制

Linux應用程式開發筆記:測試程式碼執行時間

  #include <stdio.h> #include <sys/times.h> #include <unistd.h> void main(void) { double duration; clock_t start,

Linux應用程式開發筆記:make menuconfig環境搭建

1、目的 Linux應用程式開發採用與Linux核心一致的menuconfig圖形配置,方便功能元件裁剪。   2、準備工作 下載:Kconfiglib原始碼(https://github.com/ulfalizer/Kconfiglib)   3、環境搭

Android 應用程式開發環境搭建說明

之前開發一直用的Eclipse,今年接了個Android 車載POS機專案,系統使android 7.1 的,然後準備更新sdk發現已經停止更新了,儘管之前SDK的更新也很辛苦,國內google被牆了,只能利用國內的某些映象網站實現Android SDK線上更新。然後查閱論壇,才發現我已經落伍了,

IBM 釋出企業級社交協作平臺 Domino V10,開啟快速應用程式開發的新時代

北京時間 2018 年 10 月 10 日,IBM 正式全球釋出企業級社交協作平臺 Domino V10。全新版本 Domino V10 堅持安全可控,在保留傳統開發模式的同時擁抱現代化設計,創造更快速、現代、安全的開發環境,用更快更便捷的體驗帶企業進入下一個低

《資料庫系統應用程式開發》考試

考試的主要內容是JDBC Programing with Java,除了第一大題的簡單JDBC語句,還涉及實驗報告和Java程式設計的內容。 我屆考試題目與往年極其相似,後悔沒有好好看題。。呵呵 下面附上考試真題,造福全人類。(^_^) 看完可以考滿分了。     

Java應用程式開發學習之Iterator介面

Iterator是Java中的一個介面: 該介面提供瞭如下方法: 通過前面https://blog.csdn.net/morixinguan/article/details/85006962介面的學習我們已經瞭解到,介面需要一個子類去實現它的方法,而在相關的類中已經實現了對應

Java應用程式開發學習之多型

在Java中,使用關鍵字extends繼承或者關鍵字implements實現,是Java實現多型性的前提。 一、Java多型定義的格式 父類引用指向之類物件稱之為多型,多型的定義格式主要有兩種。 (1)父類名稱 物件名 = new 子類名稱(); (2)介面名稱 物件名 = new

Java應用程式開發學習之介面

一、介面的抽象方法定義: 在任何版本的java中,介面都能定義抽象方法 格式: public abstract 返回值型別 方法名稱(引數列表); 注意事項: 1.介面當中的抽象方法,修飾符必須是兩個固定的關鍵字:public abstract 2.這兩個關鍵字修飾符,可以選擇性省略

Java應用程式開發學習之繼承

面對物件程式語言有三類特性,分別是封裝性、繼承性以及多型性。 本節就來簡單介紹下Java的繼承。 一、繼承的簡單介紹、特點、規則 繼承是多型的前提,如果沒有繼承,就沒有多型。繼承主要解決的問題是:共性抽取(解決重複程式碼的問題)。 Java繼承知識點裡兩個重要的名詞:父類和子類

Java應用程式開發學習之static關鍵字應用

Java的static關鍵字和C/C++語言的關鍵字有所不同: 一旦在Java裡使用了static關鍵字,那麼這樣的內容不再屬於物件自己,而是屬於類本身的,所以凡是本類的物件,都共享一份。 1、使用Java static關鍵字修飾成員變數 以下是Stundent類。 packag

Java應用程式開發學習之String類的使用方法

在原來文章介紹了有關Java程式開發的詳細步驟: https://blog.csdn.net/morixinguan/article/details/84956938 Java字串主要有以下特點: 1、字串的內容永不改變 2、由於字串的內容不可改變,所以字串是可以共享使用的,類似於C

Java應用程式開發學習之集合ArrayList類的使用方法

在原來文章介紹了有關Java程式開發的詳細步驟: https://blog.csdn.net/morixinguan/article/details/84956938     這節,來介紹下集合ArrayList的使用方法,回到上一篇文章的,我們一樣跟著腳步來學習使用

Java應用程式開發學習之程式編寫步驟詳細解析

最近需要預備APK的開發,由於接觸java不多,久而久之也就忘了,寫個部落格做一下學習備忘。 牢記開發步驟,才能避免以後不會走彎路。 1、開啟JDK APIXXX手冊(這裡以JDK API1.6中文版為例,找Scanner類的使用方法) 2、導包    

基於Swift的iOS應用程式開發:通過UITextFieldDelegate快速理解Delegate事件代理

// // 關於文字輸入框的事件代理,摘錄蘋果開發者中心的官方解釋如下: //*******************************************************************************************// //* To understand wh

嵌入式Linux應用程式開發——多執行緒4(執行緒的同步——訊號量)

#include <pthread.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <semaphore.h> int

嵌入式軟體應用程式開發框架淺見

最近在構思一個嵌入式系統上的應用程式開發框架,這個不單單是做一個應用程式的框架,是一個系統的。 要達到的目的就是為業務實現部分的程式提供一個框架,這個框架這麼說是一個很模糊打概念,下面詳細介紹一下這個框架。 框架要實現一些常用的功能封裝: 1. 程序間通訊的程式碼,