Netbeans 7.4およびJava 7 Update 51をダウンロードしました。NetbeansからJava DBまたはダービー接続を開始しようとすると、次のエラーが表示されます。これは、Windows 8 PC上にあります。職場でWindows XP 32ビット用のバージョンをダウンロードしました。正常に動作します。何が欠けているのか分かりません。
Thu Jan 16 00:48:23 EST 2014 : Security manager installed using the Basic server security policy.
Thu Jan 16 00:48:24 EST 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)
これは私がやったことです:
NetBeans 7.4からこの命令を実行して、Javaホームがどこにあるかを正確に調べます。
System.out.println(System.getProperty( "Java.home"));
これは私の場合の出力です:
C:\ Program Files\Java\jdk1.7.0_51\jre
これは私にとって非常に重要です。別のJava.policy
を変更していたため、効果がなく、数時間無駄になりました。
Java.policy
はUNIXスタイルのファイルで読み取り専用であるため、それをnotepad ++で開いて編集し、管理者として(同じJava homeの下で)実行しました。
C:\ Program Files\Java\jdk1.7.0_51\jre\lib\security\Java.policy
最初の付与後にこれらの行のみをファイルに追加します。
許可{ 許可Java.net.SocketPermission "localhost:1527"、 "listen"; };
幸運を。
Java™SE Development Kit 7、Update 51リリースノート
デフォルトのソケット許可の変更
信頼できないコードを含むすべてのコードに割り当てられたデフォルトのソケット許可は、このリリースで変更されました。以前は、すべてのコードが1024以上のポート番号にソケットタイプをバインドできました。各システムの一時ポート範囲にソケットをバインドすることは引き続き可能です。一時ポートの正確な範囲はオペレーティングシステムによって異なりますが、通常は高い範囲(49152〜65535など)です。新しい制限は、一時的な範囲外のソケットをバインドするには、システムセキュリティポリシーで明示的なアクセス許可が必要になることです。
クライアントtcpソケットとセキュリティマネージャーを使用するほとんどのアプリケーションでは、通常は一時ポートにバインドされるため、問題は発生しません。データグラムソケットまたはサーバーtcpソケット(およびセキュリティマネージャー)を使用するアプリケーションでは、以前に何も見られなかったセキュリティ例外が発生する場合があります。この問題が発生した場合、ユーザーは要求されているポート番号が予想されるかどうかを確認する必要があります。その場合、ローカルセキュリティポリシーにソケット許可付与を追加して問題を解決できます。
つまり、1025と49151。したがって、付与された権限のリストに次の行を追加することにより、この権限を付与できます。
Javaホームディレクトリにアクセスし、$Java_HOME/jre/lib/security/Java.policy
のポリシーファイルにアクセスして、次の変更を行います。
grant{
//List of granted permissions
permission Java.net.SocketPermission "localhost:1527", "listen";
}
「問題」の説明については、 http://www.Oracle.com/technetwork/Java/javase/7u51-relnotes-2085002.html を参照してください。 other-libs/javadbを検索
要件に応じて、デフォルトのセキュリティポリシーを変更しました
cd $Java_HOME/jre/lib/security
Java.policy
を編集します(最初にバックアップを作成してください!)
以下を追加してください
grant codeBase "file:${Java.home}}/../db/lib/*" {
permission Java.security.AllPermission;
};
これが私の要件であることに注意してください。
U51 JREを使用するすべてのアプリにDerbyを起動する許可を与えています。
編集
別の方法は、次のような許容度の低い許可セットを使用することです。
grant codeBase "file:${Java.home}}/../db/lib/*" {
permission Java.net.SocketPermission "localhost:1527", "listen,resolve";
};
NetBeansはデフォルトで、GlassFishとともにインストールされたダービーバージョンを使用します。だから、私の許可はMac上でこのように見える。 Windowsでも同様ですが、パスを変更する必要があります。
grant codeBase "file:/Applications/NetBeans/glassfish-4.0/javadb/lib/*" {
permission Java.net.SocketPermission "localhost:1527", "listen,resolve";
};
また、ホームディレクトリの.Java.policy
というファイルに必要な権限を付与することにより、ユーザーごとに問題を解決することもできます。
ここに記載されているように、UnixおよびWindowsシステムの両方で動作します。 http://docs.Oracle.com/javase/7/docs/technotes/guides/security/PolicyFiles.html
これは、JDKの更新時など、システム全体のポリシーファイルが上書きされる場合、またはシステムファイルを編集する権限がない場合に便利です。
これは私の$HOME/.Java.policy
にあるものです:
grant {
permission Java.net.SocketPermission "localhost:1527", "listen";
};
上位の対策が機能しなかったため、メインの許可セクションの最後に次の許可を追加しました。
permission Java.net.SocketPermission "localhost:1527", "listen,resolve";
これは、NetBeans wikiで次のことに出くわすまで少し頭を悩ませていました
JavaDB許可の付与
Java DBのアクセス許可を付与する方法/ Java DBを開始する方法
問題#239962に関連
JDK 7u51には、このJavaバージョンでJava DBを起動する際に問題を引き起こすいくつかのセキュリティ改善が付属しています。
NetBeansからDBを起動しようとすると、おそらく例外が発生します。
Java.security.AccessControlException:アクセスが拒否されました( "Java.net.SocketPermission" "localhost:1527" "listen、resolve")
スクリプト/ db/bin/startNetworkServerの使用を開始するときに取得するのと同じ例外
NetBeans側で修正する適切な方法がないため、Java DB側で修正する必要があるためです。
この問題に対処する方法はいくつかあります。最も簡単な方法についてのみ言及します。コマンドラインから手動でDBを起動する必要があります。
•-noSecurityManager引数を使用してJava DBを開始します。
(JDK 7u51の場所)/ db/bin/startNetworkServer -noSecurityManager
正確なソリューションではありませんが、簡単な回避策として使用できます。
最近、セキュリティに対するOracleのアプローチに少しうんざりしました。彼らはプログラマーよりもナイーブなユーザーにとってより適切な方法で私たちを私たちから守ろうとしているようです。私の見解では、自分のマシンに置いたコードは必要なことは何でもできるはずです。悪いことをするコードをそこに置くのは私のせいです。普遍的に信頼できる視点ではないことは明らかですが、私にとっては約35年間働いています。それに基づいて、これを/lib/security/Java.policyファイルに追加します。
grant codeBase "file:/-" {
permission Java.security.AllPermission;
};
file:/-はシステム上のすべてのファイルと一致し、グラントブロックは本質的に「クラスがこのファイルシステムからロードされた場合、それを信頼します」と言うことに注意してください。
さて、1つの選択肢は、JavaDBがリッスンするポートを変更して、現在は高範囲(49152から65535など)にすることです。 「ウィンドウ」->「サービス」に移動し、Java DBを右クリックして、「Java DBプロパティダイアログ」で「データベースの場所」に移動します。そのディレクトリで、ファイルderby.propertiesを編集または作成し、次の行を追加/編集します。derby.drda.portNumber = XXXXここで、XXXXは新しいポートであり、私の場合は51527を入れて正常に動作しました。
編集一見すると動作しましたが、サービスは正常に起動しましたが、NBでデータベースを作成または起動すると、「接続できません」というエラーが表示されました。 CAはjdbc:derby:// localhost:1527/sampleへの接続を確立できません。pprtを51527に変更しましたが、1527への接続を試みます
Linuxの場合、
file=`find $(dirname $(readlink -f $(which Java)))/.. -iname 'Java.policy'`; grep 1527 $file || Sudo sed -i '0,/"listen"/{s/"listen".*/\0\n\tpermission Java.net.SocketPermission "localhost:1527", "listen";/}' $file
cat $file
Javaを自動的に検出し、権限を変更します
この問題の簡単な解決策を見つけました-次のようにコマンドライン\ターミナルからJavaDBを起動します:
<base folder>/db/bin/startNetworkServer -noSecurityManager
その後、新しい権限を追加せずに正常に実行されます。
これに対する私の解決策は、jdk 1.7.45を再インストールし、netbeansをアンインストールして、古いjdkを選択して再インストールすることでした。再インストールせずにNBのSDKを変更する方法があるかどうかはわかりませんが、この方法で機能しました。