mintty+groovyc でコンパイルして実行してUTF-8な日本語を出力する

(説明省略)の部分はぐぐってください。


MSYS + mintty をインストール(説明省略)。

groovy の bin にパスが通っていること。

$ groovy -v
Groovy Version: 1.8.6 JVM: 1.6.0_31 Vendor: Sun Microsystems Inc. OS: Windows 7

以下、c:/__test で作業する。

$ cd /c/__test

次の内容の Foo.groovy を書く。エンコーディングUTF-8

println "あいうえお"

mintty で実行するとエンコーディングでこける。

$ groovy Foo.groovy
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
C:\__test\Foo.groovy: 2: expecting anything but ''\n''; got it anyway @ line 2, column 18.
   println "縺ゅ>縺?∴縺?
                    ^

1 error

オプションでエンコーディングを指定してあげると良いらしい。

$ groovy -c UTF-8 Foo.groovy
あいうえお

さすがに毎回これをやるのはだるいのでエイリアスを設定する。

$HOME/.profile に以下を追加。
$HOME/.profile がない場合は自分でファイルを作る。

alias groovy='groovy -c UTF-8'

mintty を一旦終了して起動し直す。

このとき、mintty のコマンドライン引数を次のようにする(説明省略)。
C:\MinGW\msys\1.0\bin\mintty.exe /bin/bash --login -i

~/.profile が読み込まれてエイリアスが効いていることを確認。

$ alias
alias groovy='groovy -c UTF-8'

実行してみる。

$ groovy Foo.groovy
あいうえお

コンパイルしてクラスファイルを作ってみる。

$ groovyc Foo.groovy
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Foo.groovy: 2: expecting anything but ''\n''; got it anyway @ line 2, column 18.
   println "縺ゅ>縺?∴縺?
                    ^

1 error

ここでもエンコーディングでこける。これもオプションで。

$ groovyc --encoding UTF-8 Foo.groovy
#=> Foo.class ができる

java で実行してみる。

$ java Foo
bash: java: command not found

パスが通ってなかった。 $HOME/.profile に以下を追加。

export PATH=$PATH:/c/pleiades/java/6/bin

mintty を再起動して

$ java Foo
java.lang.NoClassDefFoundError: groovy/lang/Script
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Caused by: java.lang.ClassNotFoundException: groovy.lang.Script
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        ... 12 more
Could not find the main class: Foo.  Program will exit.
Exception in thread "main"

これは
groovy-*/embeddable/groovy-all-*.jar
をクラスパスに追加すれば良いらしい。

$ java -cp /c/groovy-1.8.6/embeddable/groovy-all-1.8.6.jar Foo
java.lang.NoClassDefFoundError: Foo
Caused by: java.lang.ClassNotFoundException: Foo
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: Foo.  Program will exit.
Exception in thread "main"

カレントディレクトリがクラスパスに入っていなかった。

$ java -cp .:/c/groovy/1.8.6/embeddable/groovy-all-1.8.6.jar Foo
あいうえお

できた。