スキップしてメイン コンテンツに移動

Derby が突如 access denied で起動しない


いつも使っていた Apache Derby が起動しなくなっていた。

こちらのエラー内容は最新のJavaとDerbyの組み合わせでは発生しませんでした。修正されたようです。


Eclipse で Java のプログラムを実行したところ
こんなエラーというか例外が出て
何事か?DBファイルでも壊れたか???と一瞬焦った。

Exception in thread "main" java.sql.SQLNonTransientConnectionException: java.net.ConnectException: ポート 1527 のサーバー localhost への接続中にメッセージ 接続を拒否されました でエラーになりました。 at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown Source) at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source) at org.apache.derby.jdbc.ClientDriver.connect(Unknown Source) at java.sql.DriverManager.getConnection(DriverManager.java:571) at java.sql.DriverManager.getConnection(DriverManager.java:187)(中略)Caused by: org.apache.derby.client.am.DisconnectException: java.net.ConnectException: ポート 1527 のサーバー localhost への接続中にメッセージ 接続を拒否されました でエラーになりました。 at org.apache.derby.client.net.NetAgent.<init>(Unknown Source) at org.apache.derby.client.net.NetConnection.newAgent_(Unknown Source) at org.apache.derby.client.am.Connection.<init>(Unknown Source) at org.apache.derby.client.net.NetConnection.<init>(Unknown Source) at org.apache.derby.client.net.NetConnection40.<init>(Unknown Source) at org.apache.derby.client.net.ClientJDBCObjectFactoryImpl40.newNetConnection(Unknown Source) ... 7 moreCaused by: java.net.ConnectException: 接続を拒否されました at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:579) at java.net.Socket.connect(Socket.java:528) at java.net.Socket.<init>(Socket.java:425) at java.net.Socket.<init>(Socket.java:208) at javax.net.DefaultSocketFactory.createSocket(SocketFactory.java:271) at org.apache.derby.client.net.OpenSocketAction.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) ... 13 more

でもメッセージを読んだら
「あぁこれは Derby 落ちてるな」
と思って起動コマンドを打ってみた。

$ ./derby_start.sh

すると今度は・・・

Mon Jan 20 20:25:13 JST 2014 : セキュリティーマネージャーが Basic サーバーセキュリティーポリシーを使用してインストールされました。Mon Jan 20 20:25:13 JST 2014 : access denied ("java.net.SocketPermission" "localhost:1527" "listen,resolve")java.security.AccessControlException: access denied ("java.net.SocketPermission" "localhost:1527" "listen,resolve") at java.security.AccessControlContext.checkPermission(AccessControlContext.java:372) at java.security.AccessController.checkPermission(AccessController.java:559) at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) at java.lang.SecurityManager.checkListen(SecurityManager.java:1134) at java.net.ServerSocket.bind(ServerSocket.java:375) at java.net.ServerSocket.<init>(ServerSocket.java:237) at javax.net.DefaultServerSocketFactory.createServerSocket(ServerSocketFactory.java:231) at org.apache.derby.impl.drda.NetworkServerControlImpl.createServerSocket(Unknown Source) at org.apache.derby.impl.drda.NetworkServerControlImpl.access$000(Unknown Source) at org.apache.derby.impl.drda.NetworkServerControlImpl$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at org.apache.derby.impl.drda.NetworkServerControlImpl.blockingStart(Unknown Source) at org.apache.derby.impl.drda.NetworkServerControlImpl.executeWork(Unknown Source) at org.apache.derby.drda.NetworkServerControl.main(Unknown Source)

何やら、セキュリティ違反?
こういうことになるともう分からないので仕方なく検索。

どうもJavaの新バージョンを使うとこのエラーになるらしい。

海外サイトでポリシーファイルいじれとあったのでいじる。

いじるファイルは
JDK_HOME/jre/lib/security/java.policy
とのこと。

JDK_HOMEの場所は Eclipse の設定を見ると分かるかも。



というわけでエディタを起動。
$ sudo pluma /usr/lib/jvm/java-7-oracle/jre/lib/security/java.policy
(赤い文字の部分は各環境に合わせてください)

以下の行を、下から2行目あたりに追加。
permission java.net.SocketPermission "localhost:1527", "listen";
保存したら再度 Derby の起動に挑戦。

$ ./derby_start.sh


Mon Jan 20 20:53:29 JST 2014 : セキュリティーマネージャーが Basic サーバーセキュリティーポリシーを使用してインストールされました。
Mon Jan 20 20:53:29 JST 2014 : Apache Derby Network Server - 10.8.3.0 - (1405108) が起動し、ポート 1527 で接続の受け入れ準備が完了しました


あぁ、良かった。
起動しました。

無事に解決しました。


それにしても
こんな Java のバージョンアップ、珍しいですね。