m2

Eclipse 3.6 + Ant + S2JDBC-Gen 文字化け、コンソール停止

タイトルはこちらのパクリ。

タイトルに書いた問題は以下の公式ドキュメントに書いてあります。

Eclipse3.5上のAntにはエンコーディングの問題があり、日本語を正しく処理できません(実行するAntタスクが日本語をログ出力していると、コンソールに何も出力されません)。 Open External などのEcipseプラグインs2jdbc-gen-build.xmlコマンドプロンプトで開き、 コマンドプロンプトからAntを実行してください。

Open Externalの更新サイトは、http://update2.pragmatic.kr/ です。 プラグインのインストール画面では、「Group items by category」のチェックボックスを外してください。

Windows上でEclipse3.5を利用する場合 - Seasar2 - S2JDBC-Gen - セットアップ

Open External ってもう無いみたいですね。それになんか負けてる感じです。

これに対して一応の解決策が提示されてます。

id:newta
どうしてもeclipseから使いたくて、設定をこねくり回して
[Run Configurations]の[JRE]タブの[Run in the same JRE as the workspace]にすると
エンコードをMS932にしてもコンソールにちゃんと出力されました!

でも、dbフォルダの出力先がeclipseの作業フォルダの方になっちゃうんですよね。
WindowsのEclipse3.5のAntの問題

んーまだ完全に解決とはいってなさそう。

で、最初のリンクに書いてあるように、eclipse のコンソールへの出力を UTF-8 にすれば全部解決するっぽいです。

そこでソースを読みつつデバッガで止めたりしてたんですが、何のことはない、公式ドキュメントに書いてありました。

jvmArg

このタスクの大部分の処理は別VMで行われます。VMに引数を渡す場合は要素を使用します。 これはAntのJavaタスクで使用できると同じです。
ネストした要素として指定されるパラメータ - Seasar2 - S2JDBC-Gen - Gen-Ddl

というわけで Ant の Encoding を UTF-8 にして、こんな感じに jvmarg 要素を追加すると文字化けが解消されました。

<dump-data
  classpathdir="${classpathdir}"
  rootpackagename="${rootpackagename}"
  applyenvtoversion="${applyenvtoversion}"
  entitypackagename="${entitypackagename}"
  env="${env}"
  jdbcmanagername="${jdbcmanagername}"
  classpathref="classpath"
>
  <jvmarg value="-Dfile.encoding=UTF-8"/>
</dump-data>

このままだとコマンドプロンプトから実行したときに文字化けするので、eclipse から実行したときだけ utf-8 になるように jvmarg の値を ant プロパティに外出しして condition タスクで分岐します。

<condition property="vmarg.encoding" value="-Dfile.encoding=UTF-8" else="">
  <or>
    <!-- This property is set by eclipse3.6 as Global property. -->
    <isset property="eclipse.pdebuild.home"/>
    <!-- for eclipse3.5. Please set Global property. [Window]->[Preferences]->[Ant]->[Runtime]->[Properties]->[Global properties] -->
    <isset property="fromeclipse"/>
  </or>
</condition>

(eclipse3.5 の場合は fromeclipse というグローバルプロパティを追加して分岐するようにしています。)

あとは jvmarg の値をプロパティに書き換えればOK。

  <jvmarg value="${vmarg.encoding}"/>

これで無事コンソールに日本語が表示され、コマンドラインからはデフォルトの文字コードになります。

ant のグローバルプロパティについて

「eclipse3.5 の場合は fromeclipse というグローバルプロパティを追加して分岐するようにしています。」をみて「アレ?」と思われたかもしれません。追加なんてしなくても「eclipse.running」がすでにあるじゃないか、と。

プロパティ名の左に表示されているアイコンに注目してください。このアイコンが eclipse のアイコンになっているものは Ant を [Run in the same JRE as the workspace] で動かしたときにしか有効にならないようです。

今回はデフォルトでもある「Separate JRE」で動かすことが前提なので、「eclipse.running」は使えないことになります。

ここで Ant の Global properties の設定に「Contributor」というカラムがあったことに気付いた方は鋭いです。この Global properties は eclipse plugin から追加できます。それも Java コードは不要で、plugin.xml だけで済みます。

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
  <extension point="org.eclipse.ant.core.antProperties">
    <antProperty name="fromeclipse" value="true" eclipseRuntime="false" />
  </extension>
</plugin>

Ant Properties - Help - Eclipse SDK

簡単ですね。