2015年2月21日土曜日

JavaDB(Client/Server)を使う

JavaDBを使用するには、JDKがインストールされていることが前提。

以下はJDK1.8.0の場合で記載。

1. ライブラリが存在することを確認

次のファイルが存在していることを確認。なければJDKのインストールでJavaDBを含めるようにしてインストールして下さい。

C:\Program Files\Java\jdk1.6.0\db\lib\derbyclient.jar

2. 環境変数classpathへの追加

C:\Program Files\Java\jdk1.6.0\db\lib\derbyclient.jarを環境変数classpathに追加する

3. JavaDBサーバの起動

$ set DERBY_HOME=C:\Program Files\Java\jdk1.8.0\db
$ path=%PATH%;%DERBY_HOME%\bin
$ start startNetworkServer.bat

ところが下記のようなエラーが発生し、立ち上がりません。

$ start startNetworkServer.bat
Sat Feb 21 12:11:43 JST 2015 : セキュリティ・マネージャがBasicサーバー・セキュリティ・ポリシーを使用してインストールされました。
Sat Feb 21 12:11:44 JST 2015 : access denied ("java.net.SocketPermission" "localhost:1527" "listen,resolve")

Java7u51で、デフォルトソケット権限が変更された模様。(Java™ SE Development Kit 7, Update 51 (JDK 7u51) - Update Release Notes)

JavaDBで使用する1527ポートがエフェメラルポートの範囲外らしく、セキュリティポリシーで明示的に許可しないと使えないらしい。

そこで、セキュリティーポリシーに明示的に指定してやります。

C:\Program Files\Java\jre8\lib\security\java.policyをテキストエディタで開き、以下のコードを追加します。

grant codeBase "file:C:/Program Files/Java/jdk1.8.0/db/lib/*" {
    permission java.net.SocketPermission "localhost:1527", "listen,resolve";
};

追加後、JavaDBを起動すると正常に起動します。

$ start startNetworkServer.bat
Sat Feb 21 12:23:50 JST 2015 : Apache Derby Network Server - 10.10.1.2 - (1495037)が起動し、ポート1527で接続の受入れ準備が完了しました

別の対応方法として、JavaDBがセキュリティーマネージャーを有効にしないように起動する方法があります。

C:\Program Files\Java\jdk1.8.0\db\bin\startNetworkServer.batをテキストエディタで開きます。20行目あたりにCALL "%~dp0derby_common.bat" %*というコマンドがあるので、その次の行に、set DERBY_CMD_LINE_ARGS=-noSecurityManager %DERBY_CMD_LINE_ARGS%を追加します。これにより起動パラメータにセキュリティマネージャを無効にするオプションが含まれ、セキュリティポリシーチェックをバイパスできます。セキュリティ的には当然よろしくないと思いますが。

CALL "%~dp0derby_common.bat" %*
set DERBY_CMD_LINE_ARGS=-noSecurityManager %DERBY_CMD_LINE_ARGS%

0 件のコメント:

コメントを投稿