Cygwin から Windows の JDK を使う

ほぼ CygwinでJavaを快適に使う どおりに。ただ、俺の場合 JDK を「D:\Program Files\Java\jdk1.5.0_11」なんて位置にインストールしてたからちょっと問題が。「Program Files」の空白がですね。いつもいつも困らせてくれますね。
よくわからないけど、上のサイトの java_wrapper に適当に手を加える。
java_wrapper.patch

--- java_wrapper        2007-02-18 03:44:48.000000000 +0900
+++ java_wrapper        2007-04-12 08:52:54.046875000 +0900
@@ -50,12 +50,12 @@
 #
 # スクリプトのmain処理部
 #
-if [ -z $JAVA_HOME ]; then
+if [ -z "$JAVA_HOME" ]; then
     echo "JAVA_HOME not defined."
     exit 1;
 fi

-WIN32JDKDIR=`cygpath $JAVA_HOME`
+WIN32JDKDIR=`cygpath "$JAVA_HOME"`
 CMD=`basename $0 .exe`
 PROGRAM=$WIN32JDKDIR/bin/$CMD

@@ -67,12 +67,12 @@
     exit 0;
 fi

-if [ ! -e $PROGRAM ]; then
+if [ ! -e "$PROGRAM" ]; then
     echo "$PROGRAM not found."
     exit 1;
 fi

-if [ -n $CLASSPATH ]; then
+if [ -n "$CLASSPATH" ]; then
     CLASSPATH=`cygpath -p -w "$CLASSPATH"`
 fi

@@ -93,4 +93,4 @@
 esac

 echo CLASSPATH=$CLASSPATH CMD=$CMD PROGRMA=$PROGRAM ARGS=$ARGS
-exec $PROGRAM $ARGS
+exec "$PROGRAM" $ARGS

問題になりそうな箇所をダブルクオーテーションでくくっただけですね。java_wrapper と同ディレクトリに java_wrapper.patch として置いて「patch

追記

cygwin だと、gcj の吐くバイナリは標準ライブラリを全部静的にリンクしているらしい。

$ time gcj -c hello.java
gcj -c hello.java  0.17s user 0.23s system 63% cpu 0.631 total
$ time gcj --main=HelloWorld hello.o -o hello
gcj --main=HelloWorld hello.o -o hello  1.96s user 1.50s system 66% cpu 5.162 total
$ ll
合計 6290
-rwxr-xr-x 1 Gekko なし     422 Apr 12 09:05 HelloWorld.class*
-rwxr-xr-x 1 Gekko なし 6359834 Apr 12 20:24 hello.exe*
-rw-r--r-- 1 Gekko なし     107 Apr 12 08:04 hello.java
-rw-r--r-- 1 Gekko なし    5796 Apr 12 20:24 hello.o

コンパイルにかかる時間はたいしたことなく、オブジェクトファイルも大きくはない。リンクにとても時間がかかり、実行ファイルが超でかい。どうやらそういうことだそうで。
うすぼんやりと 2chのgcjスレ を眺めるに、UNIX系ならデフォルトで動的リンクの設定でコンパイルされるらしい。Cygwin でも静的リンクをやめて、動的リンクの方法もあるらしいけど、めんどうなのでしていない。
俺なんかはつい「ネイティブコードなんだから速いんじゃね?」と思ったりもするけども、そんな単純な話でもないらしいです。あろはさんも語ってましたけどJVMさんもけっこうがんばりやさんらしいです。
http://www.shudo.net/article/Fedora-Core-Expert-200507-GCJ/
この辺の GCJ の記事を見るに、どっちかっていうと速度とかの面でも JDK には基本的には下から起っかけてる雰囲気なのかも。

test