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
きりがついたら、どこかに公開したいと思います。
Java の Json ライブラリは Scala の Map, List などに対応していないので、 Pure Scala オブジェクトではシリアライズできません。
Scala 向けに SJSON というライブラリが公開されていて、リフレクション、型変換によるシリアライズがサポートされています。今回はこのライブラリを使って 2.8 ベースでリフレクションによるシリアライズを試してみました。
SJSON は SBT のみサポートされていますが、 Akka プロジェクトが maven リポジトリで公開してくれているので、そちらのリポジトリを参照するようにしておきます。またライブラリ内部ではさらに dispatch ライブラリを利用していますので、そちらも参照します。
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 に変換できるクラスにするには条件があります。
下のようにクラスを定義しておきます。
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 がいい感じです。
ResourceBundle, MessageSourceでproperties内に日本語でメッセージを書く - ihirokyの日記 に書かれていたものを Scala に移植しました。省略されていたので Java 版も合わせて。 Java 6 でないと動きません。
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"))
}
# baba ["java.class"のときはスーパークラスに委譲した方がいいんじゃね?]
# Ussy [お、ありがとうございます。 修正しました。]