sql-maven-pluginでencodingを指定したい!

事象

UTF-8で書いたSQLファイルをsql-maven-pluginでderbyに投入すると、文字化けする。
UTF-8だと思われてない。たぶんデフォルトエンコーディング(MS932)になってる風な化け方。


configurationにencodingを指定しても効果なし。
export LANG=ja_JP.utf8みたいにしたけどだめだった。cygwinだと無理か。


まあ、まずはプラグインとしての対応状況はどうなのよってことで調べてみる。

SQLプラグインの実装クラスのJavadocをみてみる

http://mojo.codehaus.org/sql-maven-plugin/apidocs/org/codehaus/mojo/sql/SqlExecMojo.html#setEncoding(java.lang.String)

setEncoding()は存在してる。

SQLプラグインの公開パラメータをみてみる

$ mvn help:describe -Dplugin=sql -Dfull=true


encodingパラメータは出てこない。

SQLプラグインの実装クラスのソースコードをみてみる

実装クラスのJavadocコメントに、@parameterを付け忘れているんじゃないのか?おい!

確認してみる。


実装クラスのソースコード
http://fisheye.codehaus.org/browse/~raw,r=6588/mojo/trunk/mojo/sql-maven-plugin/src/main/java/org/codehaus/mojo/sql/SqlExecMojo.java

    /**
     * Encoding to use when reading SQL statements from a file
     * @parameter expression="${encoding}" default-value= ""
     */
    private String encoding = "";


@parameterがあるな。
疑ってごめんなさい。

Javadoc上のアノテーションって結局どこに抽出されるの?

Javadocに書いたアノテーションはplugin.xmlに出力されて、プラグインのjarファイルに同梱されることになっている、らしい。


jarを解凍してplugin.xmlの中身をみてみると...。encodingパラメタが記述されてなかった!!

encodingパラメタを追加して、再びjarに固めたものをローカルリポジトリ上のオリジナルjarと差し替えてみると、encodingが効いた!

結論: 暫定対処方法

$ cd $MAVEN_REPOSITORY/org/codehaus/mojo/sql-maven-plugin/1.0/
$ mkdir temp
$ cp sql-maven-plugin-1.0.jar temp/
$ mv sql-maven-plugin-1.0.jar sql-maven-plugin-1.0.jar.original 
$ cd temp
$ jar xvf sql-maven-plugin-1.0.jar
$ vi META-INF/maven/plugin.xml
  • 以下のパラメータ定義をMETA-INF/plugin.xmlに追加する。
        <parameter>
          <name>encoding</name>
          <type>java.lang.String</type>
          <required>false</required>
          <editable>true</editable>
          <description>Encoding to use when reading SQL statements from a file</description>
        </parameter>
  • jarに固めなおす
$ cd $MAVEN_REPOSITORY/org/codehaus/mojo/sql-maven-plugin/1.0/temp
$ jar cvf sql-maven-plugin-1.0.jar *
  • 新しいjarに入れなおす
$ cp sql-maven-plugin-1.0.jar $MAVEN_REPOSITORY/org/codehaus/mojo/sql-maven-plugin/1.0


これでローカルリポジトリ上のsql-maven-pluginはencoding対応版になる。


以下のようにpom.xmlでencodingを指定してあげればOK.

    自分のpom.xmlのsql-maven-pluginのconfigure
        <configuration>
          <driver>org.apache.derby.jdbc.EmbeddedDriver</driver>
          <url>jdbc:derby:db/sample;create=true</url>
          <encoding>utf-8</encoding>
          <autocommit>true</autocommit>
        </configuration>

バグレポート?

さて、どうしよう。