无法从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) 

连接属性java数据库属性

这就是我所做的:

  1. 通过执行NetBeans 7.4中的这条指令,准确找出java家的位置:

     的System.out.println(System.getProperty( “java.home”)); 

    这是我的情况的输出:

      C:\ Program Files \ Java \ jdk1.7.0_51 \ jre 

    这对我来说很重要,我修改了另一个java.policy ,没有任何效果,浪费了我几个小时。

  2. 由于java.policy原因是一个unix风格的文件和只读,我用记事本++打开和编辑它,并以pipe理员身份执行(在同一个Java家庭):

      C:\ Program Files \ Java \ jdk1.7.0_51 \ jre \ lib \ security \ java.policy 

    在第一次授权后,只将这些行添加到文件中:

     授予{
        权限java.net.SocketPermission“localhost:1527”,“listen”;
     }; 
  3. 保存这个文件,这个权限有点棘手。 但是,如果您以pipe理员身份运行记事本++或任何其他编辑程序,则可以解决该问题。

    然后尝试从NetBeans连接数据库,它适用于我。

祝你好运。

根据Java™SE开发工具包7,更新51发行说明

更改默认套接字权限

分配给所有代码(包括不受信任代码)的默认套接字权限已在此版本中更改。 以前,所有代码都可以将任何套接字types绑定到大于或等于1024的任何端口号。仍然可以将套接字绑定到每个系统上的临时端口范围。 临时端口的确切范围随着操作系统的不同而不同,但通常在高端范围内(如从49152到65535)。 新的限制是,在短暂范围之外的绑定套接字现在需要系统安全策略中的明确权限。

大多数使用客户端TCP套接字和安全pipe理器的应用程序都不会看到任何问题,因为这些应用程序通常会绑定到临时端口。 使用数据报套接字或服务器TCP套接字(和安全pipe理器)的应用程序可能会遇到以前没有看到过的安全exception。 如果发生这种情况,用户应该检查是否需要请求的端口号,如果是这种情况,可以将套接字许可授权添加到本地安全策略中,以解决问题。

这意味着您必须明确设置应用程序的权限才能访问102549151之间的端口范围。 因此,您可以通过在授予的权限列表中追加以下行来授予此权限:

访问您的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.policyjava.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