Sync all

Webエンジニアの気になる事。困った事もろもろ。

Finagle + Thriftのbuild.sbt

またSBT関連でハマったのでメモ。

Finagle使ってThriftサーバーを立てようとしてつまづいた。

FinagleのThrift Server Sampleにscrooge-sbt-pluginを使うと書いてある。

thriftファイルを書いてビルドすればtarget/の中にjarを作成してくれる代物。

GitHub参考に以下で設定。

plugins.sbt
addSbtPlugin("com.twitter" %% "scrooge-sbt-plugin" % "3.9.2")
build.sbt
com.twitter.scrooge.ScroogeSBT.newSettings

libraryDependencies ++= Seq(
  "org.apache.thrift" % "libthrift" % "0.8.0",
  "com.twitter" %% "scrooge-core" % "3.9.2",
  "com.twitter" % "finagle-thrift_2.10" % "6.13.1"
)

ほんで、この設定でビルドしようとすると・・・

[warn] 	::::::::::::::::::::::::::::::::::::::::::::::
[warn] 	::          UNRESOLVED DEPENDENCIES         ::
[warn] 	::::::::::::::::::::::::::::::::::::::::::::::
[warn] 	:: com.twitter#scrooge-sbt-plugin;3.9.2: not found
[warn] 	::::::::::::::::::::::::::::::::::::::::::::::
[warn] 
[warn] 	Note: Some unresolved dependencies have extra attributes.  Check that these dependencies exist with the requested attributes.
[warn] 		com.twitter:scrooge-sbt-plugin:3.9.2 (sbtVersion=0.13, scalaVersion=2.10)
.
.
.

調べるとSBTのバージョンが0.13というのがダメらしい。

どんどんSBTが嫌いになる今日この頃。

まあ、それは置いておいてSBTのバージョン設定を下げよう。

project/直下にbuild.propertiesファイルを作成。

build.properties
sbt.version = 0.12.2

これでOK。

あと、pluginsで見に行くリポジトリを追加しておく。

plugins.sbt
resolvers += "sonatype" at "https://oss.sonatype.org/content/groups/public"

addSbtPlugin("com.twitter" %% "scrooge-sbt-plugin" % "3.9.2")

とりあえずこれでビルドは通った。

2014/04/21追記

thriftファイルはsrc/main/thrift/直下が標準になっているのでそこにファイルを置く。

そうすればSBTのcompile時にtarget/scala-2.10/src_managed/main/配下に指定のnamespaceで出力されます。

Scala + SBT + FinagleでNoSuchMethodException

Finagle試していたら

Finagleを使ってRPCのアプリを作っていてハマったのでメモ。

サンプルのFinagle-Httpを見ながら作っていたら実行時にException発生。

java.lang.NoSuchMethodError: scala.Predef$.augmentString(Ljava/lang/String;)Ljava/lang/String;

ん?Twittet様のサンプルが実行できないだと?

何か私の設定がおかしいに違いない。

Dependenciesのミス

build.sbtはこんな感じ。

name := "HttpServer"

version := "1.0"

resolvers ++= Seq(
  "Twitter Repository" at "http://maven.twttr.com/"
)

libraryDependencies ++= Seq(
  "org.slf4j" % "slf4j-api" % "1.7.1",
  "com.twitter" % "finagle-core" % "5.3.20",
  "com.twitter" % "finagle-http" % "5.3.20"
)

う〜ん。Webの記事パクって書いたからライブラリのバージョンか?
となって見てみると。

2014/03/05現時点でのバージョンは6.12.1



反省して修正・・・。GitHubページ見るべきだった。

  "com.twitter" % "finagle-core" % "6.12.1",
  "com.twitter" % "finagle-http" % "6.12.1"

再度実行するとまだ同じExceptionが発生。

ん?意味が分からん。

SBTの見ているScalaのバージョン修正

そういえば以前に会社の先輩がSBTの持っているScalaのバージョンもあるから依存関係多いから注意が必要と言って頂いたの思い出した!

先ほどと同じくbuild.sbtに以下追加。

  scalaVersion := "2.10.3"

もうこれで大丈夫だと思いSBTのリフレッシュ実行。

するとエラーがまた出た・・・。

##再びDependenciesのミス

libraryDependenciesの取得時にエラーが発生してライブラリが無いと起こられたのでMavenRepositoryを確認。

2.10.xでやる時は書かないと行けないんですね・・・。

  "com.twitter" % "finagle-core_2.10" % "6.12.1",
  "com.twitter" % "finagle-http_2.10" % "6.12.1"

これでなんとか実行できるように。

これに結構費やしてしまった・・・。

SBTは他にもいろいろつまづきそうな予感です。

また、つまづいたら書きます。

Guide to ScalaーScalaプログラミング入門

Guide to ScalaーScalaプログラミング入門