近年、サーバサイトを中心とした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名>
にインストールされるようになっています。この点にご注意下さい。
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
と設定して下さい。
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環境変数を設定することにより文字化けすることがあるようなので注意してください(未確認)
J2SE5からフォント周りの設定が全く変わっています。J2SDK1.4以前の方法は利用できません。J2SE5で日本語を表示するには、次のようにします。
... 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(Looking Glass)はJavaをベースとした3Dの外観を持つ次世代デスクトップシステムです。詳細はpcwebの記事(http://pcweb.mycom.co.jp/articles/2004/11/02/lg3d/ )等を参考にして下さい。ここでは、Debian上でLooking Glassを動作させる手順を紹介します。
# 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コントローラであることが分かる。
kernel/drivers/char/agpagppartとお使いのチップセットに応じたAGPのドライバを指定する。ここでは先ほどIntelのコントローラであることを確認しているので、intel-agpをインストール。
# lspci -v|grep VGA 0000:01:00.0 VGA compatible controller: ATI Technologies Inc Radeon Mobility M6 LY (prog-if 00 [VGA])上記の例では、Radeonであることが分かる。
kernel/drivers/char/drmお使いのビデオカード用のモジュール(ここではradeon)を選択
# 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で指定するモジュールはお使いのビデオカードに応じて変更すること。
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
#killall gdm #xinit # glxinfo |grep direct direct rendering: Yes上記の表示がYesになっているとokです。Noの場合は、AGP、DRMのカーネルの設定を見直して下さい。
#export JAVA_HOME=/usr/lib/j2sdk1.5-sun #export PATH=${JAVA_HOME}/bin:${PATH} #/usr/local/lg3d/bin/lg3d-session
DebianパッケージのJDKをインストールした状態で、
# apt-get install tomcat4 libapache-mod-jk tomcat4-webapps
とすると、インストールできます。mod-jkも一緒にインストールできます。
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
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。
(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
# 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のような感じで、直接のクラス実行で利用する。
JNIは、Javaからネイティブなライブラリを呼び出すためのインタフェースです。例えば、
System.loadLibrary("NativeLib");
のようなコードで読み込まれるライブラリは、gcc(もしくはg++)を使って、次のようにすると生成できます。
$ gcc -shared libNativeLib.so *.cpp -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux
Emacs上のJavaの統合開発環境。jdeパッケージをインストールすればよい。詳細は、http://yamaguch.sytes.net/~tora/java/jde.html
Crimson(libcrimson-java,J2SDK1.4のXMLパーサ)、Xerces(libxerces2-java)、GNU JAXP(libgnujaxp-java)が利用可能。
xalan(libxalan2-java)、saxon(libsaxson-java)が利用可能。
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で日本語を表示すると化けます。
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
GNUのJavaのインタプリタ。JITがないので遅い。速く実行したい場合は、上記のgcjを利用のこと。なお、gcjとgijはJavaのコアライブラリを共有しています。
オープンソースの高速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に設定する必要がなくなります。
GNUのjavadoc実装。
sablevm,kissmeなど、Debianで利用することができる。
等。
要望、コメント等があればお書き下さい。(なお、コメントはwikiに反映後、削除します)