Debianでもclojureじゃー


FreeBSDでclojureが動いた事だし、Linuxでは動く事が確実であろうから、debian
での動作確認はやめておこうかと思った。 けど、実際に動く事をこの目で確かめ
ないと気が済まぬもう一人の自分の後押しがあったので、やってみる事にする。

Debianなら、OOoの関係できっとJREぐらいは入っているに違いない。
確認してみよう。

sakae@debian:~$ java -version
java version "1.5.0"
gij (GNU libgcj) version 4.3.2

Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

これって、gccグループのやつですね。
以前、用があってFreeBSDで gcc-4.3.X をコンパイルした時、javaのライブラリィー
作成の関係で大量のメモリーを要求され、難儀した事をふと思い出した。
どこ製のやつでも動けば官軍、早速動かしてみよう。試したやつは、Windowsから
持ってきたやつだ。

sakae@debian:~/clj$ java -jar clojure.jar
Exception in thread "main" java.lang.NoClassDefFoundError: clojure.main
   at java.lang.Class.initializeClass(libgcj.so.90)
Caused by: java.lang.VerifyError: verification failed at PC 23 in clojure.main:hashCode(()I): incompatible type on stack
   at java.lang.Class.initializeClass(libgcj.so.90)

ははは、やってみるものだねぇ。動かんじゃないか。
gijはきっぱり諦める事にして、Debianは、どんなJavaが使えるのだろう?

root@debian:~# apt-cache search java
ant - Java based build tool like make
ant-doc - Java based build tool like make - API documentation and manual
 :
default-jdk - Standard Java or Java compatible Development Kit
default-jdk-builddep - Standard Java or Java compatible build dependencies
default-jre - Standard Java or Java compatible Runtime
 :
ecj - standalone version of the Eclipse Java compiler
ecj-gcj - standalone version of the Eclipse Java compiler (native version)
 :
sun-java6-jdk - Sun Java(TM) Development Kit (JDK) 6
sun-java6-jre - Sun Java(TM) Runtime Environment (JRE) 6 (architecture independe
nt files)
sun-java6-plugin - The Java(TM) Plug-in, Java SE 6

何がなんだか分からんので、純正を入れておくか。
Sunと言えばSparcだけど、作っているのは富士通と言うのは有名な話だし
JVMと言うプロセッサーぐらいしか、Sunは作ってないもんねぇ。そのJVMに
敬意を表しておこう! jreにしようかjdkにしようかと迷う所であるが、
今となっては、WindowsにもJava開発環境が無い事だし、Debianに入れて
おくのも、良い選択かなと。

oot@debian:~# apt-get install sun-java6-jdk
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
  gsfonts-x11 sun-java6-bin sun-java6-jre
Suggested packages:
  sun-java6-demo sun-java6-doc sun-java6-source sun-java6-plugin
  ia32-sun-java6-plugin sun-java6-fonts ttf-baekmuk ttf-unfonts
  ttf-unfonts-core ttf-arphic-uming
The following NEW packages will be installed:
  gsfonts-x11 sun-java6-bin sun-java6-jdk sun-java6-jre
0 upgraded, 4 newly installed, 0 to remove and 1 not upgraded.
Need to get 52.2MB of archives.
After this operation, 156MB of additional disk space will be used.

しばし待たれい! 
再び、java -version すると、GNUのjavaになっているよ。切り替え機が
あって切り替えられるのかなぁ?
Webで調べるのも面倒なので、実機を現場検証。そしたら、切り替え場所が
判明した。/etc/alternatives/ 以下にリンク集があるのね。

root@debian:/etc/alternatives# ls -l java javac
lrwxrwxrwx 1 root root 34 Mar 19 11:54 java -> /usr/lib/jvm/java-gcj/jre/bin/java*
lrwxrwxrwx 1 root root 33 Mar 19 11:54 javac -> /usr/lib/jvm/java-6-sun/bin/javac*

強引に切り替えちゃった。(あくまで、事故責任ですよ!)
lrwxrwxrwx 1 root root 45 Mar 19 12:05 java -> /usr/lib/jvm/java-6-sun-1.6.0.12/jre/bin/java*

これで、clojureが普通に動くようになりました。


ここで終わってしまっては、つまらないので、今度は、clojure を組み立てて
みよう。そう、clojureのメインページに、svnへの案内が出ているので、
開発版を取ってきて、組み立てるんだ。jdkを折角入れた事だし、後はJava用の
Makeシステムである ant を用意するだけで、簡単に試せる。

sakae@debian:~/clojure-dev$ ant
Buildfile: build.xml

clean:

init:
    [mkdir] Created dir: /home/sakae/clojure-dev/classes

compile-java:
    [javac] Compiling 119 source files to /home/sakae/clojure-dev/classes
    [javac] Note: Some input files use unchecked or unsafe operations.
    [javac] Note: Recompile with -Xlint:unchecked for details.

compile-clojure:
     [java] Compiling clojure.core to /home/sakae/clojure-dev/classes
     [java] Compiling clojure.main to /home/sakae/clojure-dev/classes
     [java] Compiling clojure.set to /home/sakae/clojure-dev/classes
     [java] Compiling clojure.xml to /home/sakae/clojure-dev/classes
     [java] Compiling clojure.zip to /home/sakae/clojure-dev/classes
     [java] Compiling clojure.inspector to /home/sakae/clojure-dev/classes

clojure:
      [jar] Building jar: /home/sakae/clojure-dev/clojure.jar

clojure-slim:
      [jar] Building jar: /home/sakae/clojure-dev/clojure-slim.jar

clojure-sources:
      [jar] Building jar: /home/sakae/clojure-dev/clojure-sources.jar

all:

BUILD SUCCESSFUL
Total time: 1 minute 32 seconds

早速、どんな具合に出来上がったか確認してみよう。

sakae@debian:~/clojure-dev$ ls -ltr
total 2316
drwxr-xr-x 5 sakae sakae    4096 Mar 19 08:36 src/
-rw-r--r-- 1 sakae sakae    2309 Mar 19 08:36 readme.txt
-rw-r--r-- 1 sakae sakae     803 Mar 19 08:36 pom.xml
-rw-r--r-- 1 sakae sakae   12917 Mar 19 08:36 epl-v10.html
-rw-r--r-- 1 sakae sakae    1484 Mar 19 08:36 clojure.iml
-rw-r--r-- 1 sakae sakae    4179 Mar 19 08:36 build.xml
drwxr-xr-x 3 sakae sakae    4096 Mar 19 12:17 classes/
-rw-r--r-- 1 sakae sakae 1487712 Mar 19 12:19 clojure.jar
-rw-r--r-- 1 sakae sakae  536475 Mar 19 12:19 clojure-slim.jar
-rw-r--r-- 1 sakae sakae  283890 Mar 19 12:19 clojure-sources.jar

スリムな版も出来上がっているぞ。標準版とは、どんな違いがあるのだろう?
jarファイルは、zipファイルなので、超いいかげんに、下記のような方法で
確認してみる。

sakae@debian:~/clojure-dev$ unzip -Z clojure.jar > A
sakae@debian:~/clojure-dev$ unzip -Z clojure-slim.jar > a
sakae@debian:~/clojure-dev$ diff -u A a
--- A   2009-03-19 12:31:56.000000000 +0900
+++ a   2009-03-19 12:32:11.000000000 +0900
@@ -1,18 +1,9 @@
-Archive:  clojure.jar   1487712 bytes   1235 files
+Archive:  clojure-slim.jar   536475 bytes   315 files
 drwxr-xr-x  2.0 unx        0 bx stor 19-Mar-09 12:19 META-INF/
--rw-r--r--  2.0 unx      143 b- defN 19-Mar-09 12:18 META-INF/MANIFEST.MF
+-rw-r--r--  2.0 unx      143 b- defN 19-Mar-09 12:19 META-INF/MANIFEST.MF
 drwxr-xr-x  2.0 unx        0 b- stor 19-Mar-09 12:18 clojure/
 drwxr-xr-x  2.0 unx        0 b- stor 19-Mar-09 12:18 clojure/asm/
 drwxr-xr-x  2.0 unx        0 b- stor 19-Mar-09 12:18 clojure/asm/commons/
-drwxr-xr-x  2.0 unx        0 b- stor 19-Mar-09 12:18 clojure/lang/
-drwxr-xr-x  2.0 unx        0 b- stor 19-Mar-09 12:18 clojure/proxy/
-drwxr-xr-x  2.0 unx        0 b- stor 19-Mar-09 12:18 clojure/proxy/clojure/
-drwxr-xr-x  2.0 unx        0 b- stor 19-Mar-09 12:18 clojure/proxy/clojure/lang/
-drwxr-xr-x  2.0 unx        0 b- stor 19-Mar-09 12:18 clojure/proxy/java/
-drwxr-xr-x  2.0 unx        0 b- stor 19-Mar-09 12:18 clojure/proxy/java/lang/
-drwxr-xr-x  2.0 unx        0 b- stor 19-Mar-09 12:18 clojure/proxy/javax/
-drwxr-xr-x  2.0 unx        0 b- stor 19-Mar-09 12:18 clojure/proxy/javax/swing/
-drwxr-xr-x  2.0 unx        0 b- stor 19-Mar-09 12:18 clojure/proxy/javax/swing/table/
 :

ざっと見、GUIを使わない時は、スリム版でいいみたい。違うかな?
S式を超複雑にした、build.xml を見ると、

(target name="clojure-slim" depends="compile-java"
 description="Create clojure-slim jar file (omits compiled Clojure code)")

ちょっと気になるコメントが書かれているなあ。