无法从Netbeans 7.4启动derby数据库
我下载了Netbeans 7.4和Java 7 Update 51.当我尝试从Netbeans启动Java DB或德比连接时,出现以下错误。 这是在Windows 8电脑上。 我在工作中下载了Windows XP的32位版本。 它工作正常。 我不知道什么是缺less的。
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风格的文件和只读,我用记事本++打开和编辑它,并以pipe理员身份执行(在同一个Java家庭):C:\ Program Files \ Java \ jdk1.7.0_51 \ jre \ lib \ security \ java.policy
在第一次授权后,只将这些行添加到文件中:
授予{ 权限java.net.SocketPermission“localhost:1527”,“listen”; };
- 保存这个文件,这个权限有点棘手。 但是,如果您以pipe理员身份运行记事本++或任何其他编辑程序,则可以解决该问题。
然后尝试从NetBeans连接数据库,它适用于我。
祝你好运。
根据Java™SE开发工具包7,更新51发行说明
更改默认套接字权限
分配给所有代码(包括不受信任代码)的默认套接字权限已在此版本中更改。 以前,所有代码都可以将任何套接字types绑定到大于或等于1024的任何端口号。仍然可以将套接字绑定到每个系统上的临时端口范围。 临时端口的确切范围随着操作系统的不同而不同,但通常在高端范围内(如从49152到65535)。 新的限制是,在短暂范围之外的绑定套接字现在需要系统安全策略中的明确权限。
大多数使用客户端TCP套接字和安全pipe理器的应用程序都不会看到任何问题,因为这些应用程序通常会绑定到临时端口。 使用数据报套接字或服务器TCP套接字(和安全pipe理器)的应用程序可能会遇到以前没有看到过的安全exception。 如果发生这种情况,用户应该检查是否需要请求的端口号,如果是这种情况,可以将套接字许可授权添加到本地安全策略中,以解决问题。
这意味着您必须明确设置应用程序的权限才能访问1025和49151之间的端口范围。 因此,您可以通过在授予的权限列表中追加以下行来授予此权限:
访问您的Java Home Directory并访问$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 。 searchother-libs / javadb
根据您的要求,我所做的是去修改默认的安全策略
cd $JAVA_HOME/jre/lib/security
编辑java.policy
( 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上将类似,但path将需要更改。
grant codeBase "file:/Applications/NetBeans/glassfish-4.0/javadb/lib/*" { permission java.net.SocketPermission "localhost:1527", "listen,resolve"; };
由于上面的措施不起作用,我在主权限部分的末尾添加了以下权限:
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"; };
我最近厌倦了Oracle的安全方法。 他们似乎试图保护我们自己的方式,比那些程序员更适合幼稚的用户。 我的观点是,我把自己的机器上的代码应该能够做任何需要的。 如果我把代码放在那里做坏事是我的错。 显然不是一个普遍可靠的观点,但它对我来说已经工作了大约35年。 在此基础上,我将其添加到我的/lib/security/java.policy文件中:
grant codeBase "file:/-" { permission java.security.AllPermission; };
请注意,文件:/ – 与系统上的任何文件相匹配,并且grant块说实质上是“如果类从这个文件系统加载,那么信任它”。
直到我在NetBeans wiki中偶然发现了这个问题之后,我才进入了这个领域
JavaDB授予权限
JavaDB授予权限
如何授予Java DB的权限/如何启动Java DB
相关的问题#239962
JDK 7u51带有一些安全性改进,这会导致在此Java版本上启动Java DB时出现问题。
当您尝试从NetBeans启动数据库时,您可能会遇到exception:
java.security.AccessControlException:访问被拒绝(“java.net.SocketPermission”“localhost:1527”“listen,resolve”)
开始使用script / db / bin / startNetworkServer时会出现同样的exception
因为在NetBeans方面没有合适的方法来解决这个问题,所以应该将其固定在Java DB的一边。
如何处理这个问题有几种方法。 我只会提到最简单的方法。 您必须从命令行手动启动数据库。
•使用-noSecurityManager参数启动Java DB。
(JDK 7u51位置)/ db / bin / startNetworkServer -noSecurityManager
虽然这不完全是一个解决scheme,它可以作为一个快速的解决方法。
我的解决scheme是重新安装jdk 1.7.45,卸载netbeans并重新安装它select过时的jdk。 不知道是否有一种方法来改变sdk而不重新安装它,但它的工作方式。
那么,一种替代方法是将JavaDB监听的端口改为高端(如49152至65535)。 转到Window-> Services,然后右键点击Java DB,在“Java DB Properties Dialog”转到“Database Location”,在我的系统中这是“C:\ Users \ ahernandeza.netbeans-derby”在那个目录下编辑或者创build文件derby.properties,并添加/编辑该行:derby.drda.portNumber = XXXX其中XXXX是新的端口,在我的情况下,我把51527,工作得很好。
编辑在fisrt一眼,它的工作,服务启动就好了,但是当在NB中创build或启动数据库时,我得到了无法连接的错误。 CAn没有build立连接到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
它会自动find你的Java和更改权限
我发现了一个快速解决这个问题的方法 – 从命令行\terminal启动你的JavaDB,如下所示:
<base folder>/db/bin/startNetworkServer -noSecurityManager
然后它运行良好,没有添加新的权限。
问题是Java 7u51,它有一个影响Derby和其他程序和库的bug,我build议安装Java 7u45