我下载了Netbeans 7.4和Java 7 Update 51.当我尝试从Netbeans启动Java DB或derby连接时出现以下错误。这是在Windows 8 PC上。我在工作时下载了windows xp 32 bit的版本。它工作正常。我不确定缺少什么。
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)
答案 0 :(得分:107)
这就是我所做的:
通过从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主目录下):
C:\Program Files\Java\jdk1.7.0_51\jre\lib\security\java.policy
在第一次授权后,只将这些行添加到文件中:
grant { permission java.net.SocketPermission "localhost:1527", "listen"; };
答案 1 :(得分:31)
根据Java™ SE Development Kit 7, Update 51 Release Notes
更改默认套接字权限
此版本中已更改分配给所有代码(包括不受信任代码)的默认套接字权限。以前,所有代码都能够将任何套接字类型绑定到大于或等于1024的任何端口号。仍然可以将套接字绑定到每个系统上的临时端口范围。短暂端口的确切范围因操作系统而异,但通常在高范围内(例如从49152到65535)。新的限制是,临时范围之外的绑定套接字现在需要系统安全策略中的显式权限。
使用客户端tcp套接字和安全管理器的大多数应用程序都不会遇到任何问题,因为它们通常会绑定到临时端口。使用数据报套接字或服务器tcp套接字(以及安全管理器)的应用程序可能会遇到之前未见过的安全异常。如果发生这种情况,用户应检查是否需要请求的端口号,如果是这种情况,可以将套接字权限授予添加到本地安全策略,以解决此问题。
这意味着您必须明确设置应用程序的权限,以便能够访问 1025 和 49151 之间的端口范围EM> 即可。因此,您可以通过在授予的权限列表中附加此行来授予此权限:
访问您的Java主目录并访问$JAVA_HOME/jre/lib/security/java.policy
处的政策文件并进行以下更改。
grant{
//List of granted permissions
permission java.net.SocketPermission "localhost:1527", "listen";
}
答案 2 :(得分:15)
有关“问题”的说明,请参阅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一起安装的derby版本。所以我的权限在Mac上看起来像这样。它在Windows上类似,但路径需要更改。
grant codeBase "file:/Applications/NetBeans/glassfish-4.0/javadb/lib/*" {
permission java.net.SocketPermission "localhost:1527", "listen,resolve";
};
答案 3 :(得分:5)
由于上层措施不起作用,我将以下权限添加到主权限部分的末尾:
permission java.net.SocketPermission "localhost:1527", "listen,resolve";
答案 4 :(得分:5)
您还可以在主目录中名为.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";
};
答案 5 :(得分:3)
我最近厌倦了Oracle的安全方法。他们似乎试图以比程序员更适合天真用户的方式保护我们自己。我的观点是,我在自己的机器上放置的代码应该能够做任何需要的事情。如果我把代码放在那里做坏事就是我的错。显然不是一个普遍可靠的观点,但它对我有用了大约35年。在此基础上,我将其添加到我的/lib/security/java.policy文件中:
grant codeBase "file:/-" {
permission java.security.AllPermission;
};
请注意,文件:/ - 匹配系统上的任何文件,并且授权块本质上表示“如果从此文件系统加载类,则信任它”。
答案 6 :(得分:3)
直到我在NetBeans wiki中偶然发现以下内容之前,我正在努力实现这一目标
JavaDB授予权限
如何为Java DB授予权限/如何启动Java DB
与问题#239962相关
JDK 7u51带来了一些导致的安全性改进 在此Java版本上启动Java DB的问题。
当您尝试从NetBeans启动数据库时,您可能会获得 例外:
java.security.AccessControlException:访问被拒绝 (“java.net.SocketPermission”“localhost:1527”“listen,resolve”)
开始使用script / db / bin / startNetworkServer
时会遇到同样的异常因为没有合适的方法在NetBeans端修复它 这应该固定在Java DB的一侧。
有几种方法可以解决这个问题。我会提到 只有最简单的方法。您必须从命令行手动启动DB。
•使用-noSecurityManager参数启动Java DB。
(JDK 7u51位置)/ db / bin / startNetworkServer -noSecurityManager
虽然它不是一个完全解决方案,但它可以作为快速解决方法使用。
答案 7 :(得分:0)
我的解决方案是重新安装jdk 1.7.45,卸载netbeans并重新安装它选择过时的jdk。不知道是否有办法在NB中更改sdk而不重新安装它,但它以这种方式工作。
答案 8 :(得分:0)
好吧,另一种方法是更改JavaDB侦听的端口,现在处于高范围(例如从49152到65535)。 转到Window-&gt; Services,然后右键单击Java DB并在“Java DB Properties Dialog”中转到“Database Location”,在我的系统中是“C:\ Users \ ahernandeza.netbeans-derby” 在该目录中编辑或创建文件derby.properties,并添加/编辑该行: derby.drda.portNumber = XXXX XXXX是新端口,在我的情况下我放了51527并且工作得很好。
EDIT 在fisrt一眼就可以了,服务开始很好,但是当在NB中创建或启动数据库时,我得到错误无法连接。 CAn没有与jdbc:derby:// localhost:1527 / sample建立连接 虽然我将pprt更改为51527,但它尝试连接到1527
答案 9 :(得分:0)
如果是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并更改权限
答案 10 :(得分:0)
我找到了这个问题的快速解决方案 - 从命令行\ terminal启动JavaDB,如下所示:
<base folder>/db/bin/startNetworkServer -noSecurityManager
然后它运行正常而不添加新权限。
答案 11 :(得分:-2)
问题是Java 7u51,它有一个影响Derby和其他程序和库的bug,我建议安装Java 7u45