はじめに

近年、サーバサイトを中心としたJavaの拡大は留まることを知りません。Java/J2EEを利用するための書籍も山程でていますが、残念ながらDebianでのJavaの利用方法をまともに扱った書籍は見当たりません。Debianは、Javaのアプリケーションをサポートする数少ないLinuxディストリビューションであり、一旦利用方法を覚えれば、非常に簡単にJavaアプリケーションの開発/検証環境を構築することができます。Debianのセキュリティの高さをそのままにJavaのアプリケーションを動かすことができるのは大きなメリットとなるでしょう。ここでは、Debian SargeでJavaを利用する方法を紹介します。これを機に一人でもDebianのJavaが増えれば幸いです。

なお、DebianのJavaでは、できるだけFHS(UNIX上のファイル配置を決めるポリシー)に従うように各ファイルがインストールされるようになっています。例えば、jarファイルは、

/usr/share/java

に、ドキュメントは

/usr/share/doc/<パッケージ名>

に、JDKは、

/usr/lib/<JDK名>

にインストールされるようになっています。この点にご注意下さい。

JDKをインストール

SUNのJDK

Debian では、SUN の JDK1.3 や JDK1.4 をもちろん使うことができます。SUNのサイト(http://java.sun.com/ )からダウンロードしたアーカイブをお好みのディレクトリにインストールすればインストール完了ですが、java-packageを利用してSUNからダウンロードしたアーカイブから、Debianのパッケージを作成してからインストールすると、Debianのパッケージ管理の仕組みでJavaVMを管理できるので便利です。java-packageはsarge(contrib)に含まれるので、次のようにして普通にインストールできます。

※/etc/apt/sources.list に 'contrib' がないなら事前に追加する
deb http://ftp2.jp.debian.org/debian/ stable main contrib
# apt-get update
# apt-get install java-package

j2sdkをSUNのサイトからJ2SDK(tgz形式)をダウンロードして、次のようにしてパッケージを作成、インストールします。

# chmod a+x j2sdk-1_4_1_01-linux-i586.bin  
# make-jpkg j2sdk-1_4_1_01-linux-i586.bin  パッケージ作成
# apt-get install java-common              java共通パッケージインストール
# dpkg -i sun-j2sdk1.4_1.4.1.01-0.8_i386.deb   パッケージインストール
# apt-get install sun-j2sdk1.4debian       java2-runtimeをprovide。Javaパッケージの依存関係を解決するのに必要

すると、  /usr/lib/<JDK名> にJDKがインストールされます。

ここで注意ですが、NetBeans?を同梱したJDKのバイナリはjava-packageで変換できません。JDK単独の配布を使ってください。また、JavaVMはjava1-runtime,java2-runtime等をprovideすることが必要ですが、sun-j2sdk1.4debian等のパッケージをインストールすることが必要となります。

J2SDK1.3等の古いJavaVMを実行すると、

/usr/local/jdk1.3.1_10/bin/i386/native_threads/java: error while loading shared libraries: 
libstdc++-libc6.1-1.so.2: cannot open shared object file: No such file or directory

とエラーメッセージが表示されJavaVMを実行できない場合があります。Debianでは、C++用のライブラリのバージョンが古いJavaVMが要求するバージョンより新しいものを利用しているためこのような問題が発生します。これを解決するには、/usr/libディレクトリで、

ln -s libstdc++-libc6.2-2.so.3 libstdc++-libc6.1-1.so.2

と、新しいライブラリを古いライブラリのファイル名にリンクしてやると動作するようになります。

また、NPTLに対応していない、JavaVMをカーネル2.6.xで動かすとエラーが発生します。その場合は、環境変数を、

LD_ASSUME_KERNEL=2.2.5

と設定して下さい。

フォントの設定(J2SDK1.4/1.3)

JAVA_HOME/jre/lib/font.properties.jaに次のパッチを当てる。 http://yamaguch.sytes.net/~tora/tmp/font.properties.ja-patch あとは、ttf-kochi-(mincho|gothic)をインストールして、/etc/X11/XF86Config-4に

Section "Files"
       ... 
       FontPath     "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType/"
       ...
EndSection

Section "Module"
       ...
       Load "xtt"
       ...
EndSection

を追加する。

TrueType?フォントをX-Windowなしで利用するには、

# export JAVA_FONTS=/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType

とJAVA_FONTS環境変数を設定する(Xサーバが起動していて、Xサーバのフォントが利用できる状態であれば、この設定は不要。VNCサーバ経由では必要)

注: J2SDK1.4.2ではJAVA_FONTS環境変数を設定することにより文字化けすることがあるようなので注意してください(未確認)

フォントの設定(J2SDK5(J2SE5))

J2SE5からフォント周りの設定が全く変わっています。J2SDK1.4以前の方法は利用できません。J2SE5で日本語を表示するには、次のようにします。

  • JAVA_HOME/jre/libディレクトリのfontconfig.Redhat.8.0.propertiesを同ディレクトリのfontconfig.propertiesにコピーします。
  • fontconfig.properties内の全ての-misc-kochiを-sazanami-に置換します。すると、次のようになります。
    ...
    serif.plain.japanese-x0201=-sazanami-mincho-medium-r-normal--*-%d-*-*-c-*-jisx0201.1976-0
    serif.plain.japanese-x0208=-sazanami-mincho-medium-r-normal--*-%d-*-*-c-*-jisx0208.1983-0
    ...
    これで日本語のフォントが表示されるようになるはずです。他のフォントを利用したい場合は、-sazanami-の変わりに別の文字列に置換して下さい。Perlで次のようにすると簡単に変換できます(from 宇宙人日記。)。
    $ perl -p -e \
      's/=-misc-kochi /=-sazanami-/g,s/misc-kochi_/sazanami-/g,s#ja/TrueType/kochi#truetype/sazanami/sazanami#g' \
      fontconfig.properties.src > fontconfig.properties

有効なフォントを確認

なんか知らないけど文字化けする。本当にフォントはインストールされているのかなぁ。そんなときは、JAVA_HOME/demo/jfc/Font2DTestディレクトリにあるFont2DTest.jarを実行してみる。

$ java -jar Font2DTest.jar

lg3d

lg3d(Looking Glass)はJavaをベースとした3Dの外観を持つ次世代デスクトップシステムです。詳細はpcwebの記事(http://pcweb.mycom.co.jp/articles/2004/11/02/lg3d/ )等を参考にして下さい。ここでは、Debian上でLooking Glassを動作させる手順を紹介します。

  1. AGPを有効にする。
    1. lspciを利用して、AGPのコントローラを確認。
      # lspci  -v|grep AGP
      0000:00:01.0 PCI bridge: Intel Corp. 82855PM Processor to AGP Controller (rev 03) (prog-if 00 [Normal decode])  
      ここでは、Intelの82855PMがAGPコントローラであることが分かる。
    2. modconfを起動。下記のモジュールのカテゴリを選択。
      kernel/drivers/char/agp
      agppartとお使いのチップセットに応じたAGPのドライバを指定する。ここでは先ほどIntelのコントローラであることを確認しているので、intel-agpをインストール。
  2. DRMを有効にする
    1. lspciを利用して、ビデオカードを確認
      # lspci  -v|grep VGA
      0000:01:00.0 VGA compatible controller: ATI Technologies Inc Radeon Mobility M6 LY (prog-if 00 [VGA])
      上記の例では、Radeonであることが分かる。
    2. modconfを起動。下記のモジュールカテゴリを選択。
         kernel/drivers/char/drm
      お使いのビデオカード用のモジュール(ここではradeon)を選択
  3. J2SDK1.5.0_01インストール http://java.sun.com/ よりJ2SDK1.5.0_01をダウンロードしてインストール。
  4. Java3DとJAIをインストール
  5. lg3d-0-6-1.tar.gz (Release0.61)を下記のURLよりダウンロードし、/usr/localに解凍。 https://lg3d-core.dev.java.net/servlets/ProjectDocumentList?folderID=1516&expandFolder=1516&folderID=0
  6. DRIに対応したXサーバ(xserver-xfree86-dri-trunk*.deb))、Mesa(xlibmesa-gl1-dri-trunk*.deb)を、drmモジュール(drm-trunk-module-src*.deb)のパッケージを次のURLよりダウンロードしインストール。 http://www.nixnuts.net/files/binary/
  7. DRIのカーネルモジュールをコンパイル(kernel-headerパッケージが必要) 下記の手順で、DRIのカーネルモジュールをコンパイル、カーネルにロードする。
    # tar zxvf /usr/src/drm-trunk.tar.gz
    # cd drm-trunk/linux-2.6
    # make -f Makefile
    # rmmod radeon   (カーネルデフォルトのDRMを削除)
    # inmod radeon.ko (DRIで配布しているDRMをインストール)
    rmmodとinsmodで指定するモジュールはお使いのビデオカードに応じて変更すること。
  8. Xの設定 /etc/X11/XF86Config-4をXorg.confにコピーし、Xorg.confのDRIを有効にする。設定例は下記を参照。
    Section "Module"
    ...
    	Load  "dri"
    	Load  "glcore"
    	Load  "glx"
    ...
    
    Section "InputDevice"
    	Identifier  "Keyboard0"
     	Driver      "kbd"  (XFree86 4.3.0ではkeyboard)
    ...
    
    Section "DRI"
      Mode 0666
    EndSection
    
    ...
    
    Section "Device"
    	Identifier	"ATI Technologies, Inc. Radeon Mobility M6 [LY]"
    	Driver		"ati"
     	Option		"AGPMode" "4"
    	Option		"AGPFastWrite" "on"
    	Option		"EnablePageFlip" "on"
    	VideoRam    16384
    EndSection
  9. Xを再起動、DRIが有効になっているかどうか確認
    #killall gdm
    #xinit
    # glxinfo |grep direct
    direct rendering: Yes
    上記の表示がYesになっているとokです。Noの場合は、AGP、DRMのカーネルの設定を見直して下さい。
  10. lg3dを起動
    #export JAVA_HOME=/usr/lib/j2sdk1.5-sun
    #export PATH=${JAVA_HOME}/bin:${PATH}
    #/usr/local/lg3d/bin/lg3d-session

Tomcat

インストール

DebianパッケージのJDKをインストールした状態で、

# apt-get install tomcat4 libapache-mod-jk tomcat4-webapps

とすると、インストールできます。mod-jkも一緒にインストールできます。

mod-jkを利用してApacheと連携

etc/tomcat4/server.xmlのAjp13Connectorの設定のコメントを外します。

<Connector className="org.apache.ajp.tomcat4.Ajp13Connector"
          port="8009" minProcessors="5" maxProcessors="75"
          acceptCount="10" debug="0" address="127.0.0.1"/>

TomcatデフォルトのHTTPポート(8180)を無効にする場合は、下記の記述をコメントアウトします。

<--
   <Connector className="org.apache.catalina.connector.http.HttpConnector"
              port="8180" minProcessors="5" maxProcessors="75"
              enableLookups="true" acceptCount="10" debug="0"
              connectionTimeout="60000"/>
-->

/var/lib/tomcat/conf/mod_jk.confに例えば次のような感じでmod-jkの設定を追加します。

JkLogFile /var/log/tomcat4/mod_jk.log
JkLogLevel error

JkMount /*.jsp ajp13
JkMount /servlet/* ajp13 

Alias /examples "/var/lib/tomcat4/webapps/examples"

#
# The following line mounts all JSP files and the /servlet/ uri to tomcat
#
JkMount /examples/servlet/* ajp13
JkMount /examples/*.jsp ajp13

tomcatを再起動すると、http://localhost/examples/jsp/等でTomcatの例題アプリケーションにアクセスできます。

mod-jkを使うと、apj13のポート(8009番)が空いてしまいます。iptatblesを使って、8009番のTCPの接続を受け付けないようにすると、セキュリティが向上します。

#/sbin/iptables -A INPUT  -i eth0 -p tcp --dport 8009  -j REJECT

mod-jk2

Progencyのサイト http://ptk-archive.progeny.com/debian/pool/main/m/mod-jk2-2.0/ でdebを配布しているので、これを利用。

(2006/10時点の Debian sarge) libapache2-mod-jk2 が存在します。Apache 1.3向けには libapache-mod-jk。

JDBCドライバをサーブレット/JSPから利用

(2006/10時点の Debian sarge) MySQL 4.0/4.1については、パッケージ libmysql-java をインストールした後、しかるべき所にシンボリックリンクを置いてやれば動きます。

ln -s /usr/share/java/mysql.jar /usr/share/tomcat4/common/lib/

Debianは世界で一番セキュリティが高いLinuxディストリビューションと言われています。DebianのTomcatでは、その名に恥じずデフォルトでセキュリティマネージャが有効になっています。しかし、これによりPostgreSQL/MySQL等のJDBCドライバを利用しようとすると、ソケット通信ができず、次のようにエラーが出力されます。

Something unusual has occured to cause the driver to fail. Please report
this exception: Exception: java.security.AccessControlException: access 
denied (java.net.SocketPermission localhost resolve)
Stack Trace:

java.security.AccessControlException: access denied 
(java.net.SocketPermission localhost resolve)
	at java.security.AccessControlContext.checkPermission
(AccessControlContext.java:272)
	at java.security.AccessController.checkPermission 
(AccessController.java:399)
	at java.lang.SecurityManager.checkPermission(SecurityManager.java:545)
	at java.lang.SecurityManager.checkConnect(SecurityManager.java:1042)

Debian版Tomcatのセキュリティマネージャの設定は、 /etc/tomcat4/policy.dディレクトリに置かれています。セキュリティマネージャの設定を変更して、JDBCドライバのjarからネットワークへのアクセスを許可するには、例えば、99examples.policyに下記のように変更します。

//PostgreSQLの場合
grant codeBase "file:${catalina.home}/webapps/examples/WEB-INF/lib/postgresql- jdbc2.jar!/-" {
     permission java.net.SocketPermission "localhost:5432", "connect";
};
//MySQLの場合
grant codeBase "file:${catalina.home}/webapps/examples/WEB-INF/lib/mysql.jar!/-" {
     permission java.net.SocketPermission "localhost:3306", "connect";
};

上でつまづく場合、動作確認用の(ゆるい)設定は以下の通り。検証するならばここから初めて、設定を追加すると良いでしょう。

grant {
    permission java.net.SocketPermission "*", "connect";
};

余談ですが、DebianのPostgreSQLとMySQLはデフォルトでは、ネットワークポートが開いていないので、ポートが正しく開いているかとうかも確認しましょう。

MySQLの場合
# netstat -a | grep LISTEN
tcp        0      0 *:mysql                 *:*                     LISTEN

Ant

  • main版とcontrib版がある(というか、分かれる予定)。
  • main版のantは(最新版はlibant1.6-javaパッケージ)、/usr/share/antX.Xディレクトリにインストールされる。ラッパスクリプトはインストールされないので、
    # java -classpath /usr/share/antX.X/lib/ant.lib:/usr/share/antX.X/lib/ant-launcher.jar:. \
    org.apache.tools.ant.Main -f build.xml
    のような感じで、直接のクラス実行で利用する。
  • upstreamにはない、gjdocタスクが含まれ、SUNのjavadocの代わりにgjdocを利用することが可能。

JNIについて

JNIは、Javaからネイティブなライブラリを呼び出すためのインタフェースです。例えば、

System.loadLibrary("NativeLib");

のようなコードで読み込まれるライブラリは、gcc(もしくはg++)を使って、次のようにすると生成できます。

$ gcc -shared libNativeLib.so *.cpp -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux

Eclipse

  • eclipse-sdkパッケージをインストールすればよい。日本語化はeclipse-nls-sdkパッケージをインストール。
  • JAVA_HOME環境変数を設定しないと日本語メッセージは表示されない。
  • コードアシスト時の候補選択でCtrl+p Ctrl+nが使える(Debian 独自)
  • Emacsのキーバインドが幾つか改善されている(Debian 独自)
  • Debian独自の機能/コンフィギュレーションは/usr/share/doc/eclipse-sdk/README.Debianを読むと良い。

JDEE

Emacs上のJavaの統合開発環境。jdeパッケージをインストールすればよい。詳細は、http://yamaguch.sytes.net/~tora/java/jde.html

XML

XML Parser

Crimson(libcrimson-java,J2SDK1.4のXMLパーサ)、Xerces(libxerces2-java)、GNU JAXP(libgnujaxp-java)が利用可能。

XSLT Processor

xalan(libxalan2-java)、saxon(libsaxson-java)が利用可能。

オープンソースのJava環境

kaffe

Kaffe VM は、オープンソースかつフリーな Java VM です。様々なプラットフォームに 移植されています。ちなみに、 Kaffe のプロジェクトマネージャ Jim Pick は、さり げなく Debian Developer だったりします。Kaffe も Debian の main パッケージに含 まれているので、

# apt-get install kaffe

とするだけで、インストールできます。

使い方

基本的に普通のJava VMと同じように使えます。ただ、Localeを指定する際に多少癖があります。Kaffeは、環境変数の LANG を変更しても、Locale が変わりません。次のように直接プロパティを指定します。

# java -Duser.language=ja -Duser.region=JP -Dfile.encoding=EUC_JP クラス名

Kaffe には、kjc という Java コンパイラが付属しています。この kjc を使うには、以下のようにします。

# java -Dfile.encoding=EUC_JP -jar /usr/share/kaffe/kjc.jar Javaソース

注1:AWTで日本語を表示すると化けます。

gcj

GNUのJavaコンパイラ&実行環境。Javaのソースからネイティブなコードを生成し高速にJavaのプログラムを実行することができる。いわゆるAOT(ahead of time)コンパイラ。通常のコンパイラのようにクラスファイル(.class)を生成に利用することも可能です。

gcj を用いて Java ソースからネイティブな実行ファイルを生成するには、下記のようにします。--main= で main メソッドが定義されているクラスを指定するのを忘れないで下さい。

# gcj -o HelloWorld --main=HelloWorld HelloWorld.java

あとは、生成されたバイナリHelloWorld?を実行すれば、Javaプログラムが実行されます。ネイティブなコードを生成せずに、通常のクラスファイルを生成するJavaコンパイラとして利用したい場合は、-Cオプションを付けます。

# gcj -C HelloWorld.java

gij

GNUのJavaのインタプリタ。JITがないので遅い。速く実行したい場合は、上記のgcjを利用のこと。なお、gcjとgijはJavaのコアライブラリを共有しています。

jikes

オープンソースの高速Javaコンパイラ。当初IBMが開発していたが、現在はオープンソースとなり、コミュニティにより開発されています。コンパイルの速度が javac に比べて速く、互換性も非常に高いです。また、エラーメッセージもJavacに比べると詳しく表示してくれます。Debianでは、jikesパッケージをインストールするとjikesが使えるようになります。jikesはコアクラスを含んでいないので、利用する際には、クラスパスに下記のようにコアクラスを含める必要があります。

# export CLASSPATH=/usr/lib/kaffe/jre/lib/rt.jar
# jikes -encoding euc-jp HelloWorld.java

jikes-classpath,jikes-gij,jikes-kaffe,jikes-sablevm,jikes-sun等のjikesへのラッパパッケージを利用すると、コアクラスをCLASSPATHに設定する必要がなくなります。

gjdoc

GNUのjavadoc実装。

  • Xerces2 or GNU JAXP+Xalan2で動作。SaxonではStreamSource?の実装の違いにより動作しない。
  • upstreamはkaffeで動作しないが、debian版はkaffeで動作する。

JavaVM色々

sablevm,kissmeなど、Debianで利用することができる。

等。

その他

  • JRockit1.4.2_04は正しく動作しています。

コメントなど

要望、コメント等があればお書き下さい。(なお、コメントはwikiに反映後、削除します)