トップ 追記

Ussy Diary


2010-09-03

Maven Resource Continuous Deploy Plugin

Scala でエディタでリソースファイルを書き換えて、 mvn scala:cc だとリソースファイルを変更してもデプロイしてくれず不便でした。 Eclipse で WTP プラグインを使って開発していると、基本的に自動でパブリッシュしてくれるのですが、 Emacs で書いているとパブリッシュしてくれず Java は IDE でないと厳しいのかもしれません。しかし、ここは Scala。エディタで書いています。いや、エディタで書ける言語であって欲しい。なければつくれ、ということで maven plugin を書いたこともなかったので書いてみました。

まだ作り込みが甘いかもしれないですが、ひとまずソースだけ公開だけしておきます。

http://github.com/ussy/maven-resource-cd-plugin

まだどこかのリポジトリに公開しているわけでもないので、 mvn install してローカルリポジトリに入れてください。対象プロジェクトの pom.xml に以下の記述をしてください。

<plugin>
    <groupId>net.pshared.maven</groupId>
    <artifactId>maven-resource-cd-plugin</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</plugin>

後は以下のコマンドを入力することで、リソースファイルを 1 秒間隔で監視します。

$ mvn resource-cd:execute

終了するには Ctrl-C でシグナルを送る必要があります。 Java で Signal 掴むのはマナー違反な気がしますが。

今サポートしているのが、新規ファイル追加、既存ファイル更新、ファイル削除の基本操作です。ディレクトリもつくりますが、今のところファイル削除で空ディレクトリになってもディレクトリは残すようにしています。

src/main/resources/message.properties を更新すると target の message.properties にコピー

copy /Users/ussy/repos/example/target/classes/message.properties

src/main/resources/temp/a.txt を remove すると target の a.txt を削除

delete /Users/ussy/repos/example/target/classes/temp/a.txt

きりがついたら、どこかに公開したいと思います。

Tags: Maven Java

2010-08-22

SJSON でオブジェクトを JSON 形式にシリアライズする

Java の Json ライブラリは Scala の Map, List などに対応していないので、 Pure Scala オブジェクトではシリアライズできません。

Scala 向けに SJSON というライブラリが公開されていて、リフレクション、型変換によるシリアライズがサポートされています。今回はこのライブラリを使って 2.8 ベースでリフレクションによるシリアライズを試してみました。

SJSON は SBT のみサポートされていますが、 Akka プロジェクトが maven リポジトリで公開してくれているので、そちらのリポジトリを参照するようにしておきます。またライブラリ内部ではさらに dispatch ライブラリを利用していますので、そちらも参照します。

pom.xml

SJSON が登録されているリポジトリを登録します。

<repository>
  <id>akka.repository</id>
  <url>http://scalablesolutions.se/akka/repository</url>
</repository>

dispatch が登録されているリポジトリを登録します。

<repository>
  <id>scala-tools.org</id>
  <url>http://scala-tools.org/repo-releases</url>
</repository>

ライブラリの依存関係を書いておきます。

<dependency>
  <groupId>sjson.json</groupId>
  <artifactId>sjson</artifactId>
  <version>0.7-2.8.0</version>
</dependency>
<dependency>
  <groupId>net.databinder</groupId>
  <artifactId>dispatch-json_2.8.0</artifactId>
  <version>0.7.5</version>
</dependency>

ライブラリを取り込んだらシリアライズするだけなのですが、 JSON に変換できるクラスにするには条件があります。

  • @BeanInfo を指定する
  • case class にする

下のようにクラスを定義しておきます。

import scala.reflect.BeanInfo
@BeanInfo case class Person(name: String, fav: Map[String, String])

定義ができたら SJSON#out でシリアライズできます。

import sjson.json.Serializer.SJSON
SJSON.out(Person("ussy", Map("1" -> "Scala", "2" -> "Ruby")))

SJSON#out は byte 配列で返してくるので

new String(SJSON.out(Person("ussy", Map("1" -> "Scala", "2" -> "Ruby"))))

とすると JSON 文字列が返ってきます。

{"fav":{"1":"Scala","2":"Ruby"},"name":"ussy"}

内部で JSON 文字列に変換したあとに、 getBytes("UTF-8") してくれているのですが、 JSON 文字列をただ返してくれるものがあってもいいような感じがしますね。

そんなわけで Java では Gson や JSONIC が有名ですが、 Scala では今のところ SJSON がいい感じです。

Tags: Scala Json

2010-08-17

native2ascii がいらない ResourceBundle

ResourceBundle, MessageSourceでproperties内に日本語でメッセージを書く - ihirokyの日記 に書かれていたものを Scala に移植しました。省略されていたので Java 版も合わせて。 Java 6 でないと動きません。

Java
http://gist.github.com/531362
Scala
http://gist.github.com/531371

参考

ListResourceBundle を使ってみると、こんな感じ。

import java.util._

class messages extends ListResourceBundle {
  val resources = Array(
    Array("message", "さようなら native2ascii")
  ).asInstanceOf[Array[Array[AnyRef]]]

  override def getContents() = resources
}

object Main extends Application {
  val resource = ResourceBundle.getBundle("messages")
  println(resource.getString("message"))
}
Tags: Java Scala
本日のツッコミ(全2件) [ツッコミを入れる]

# baba ["java.class"のときはスーパークラスに委譲した方がいいんじゃね?]

# Ussy [お、ありがとうございます。 修正しました。]