Java 无法从Netbeans 7.4启动derby数据库

Java 无法从Netbeans 7.4启动derby数据库,java,netbeans,derby,Java,Netbeans,Derby,我下载了NetBeans7.4和Java7更新51。当我试图从Netbeans启动javadb或derby连接时,我遇到了以下错误。这是在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 :

我下载了NetBeans7.4和Java7更新51。当我试图从Netbeans启动javadb或derby连接时,我遇到了以下错误。这是在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)
2014年1月16日星期四00:48:23东部时间:使用基本服务器安全策略安装安全管理器。
2014年1月16日星期四00:48:24美国东部时间:访问被拒绝(“java.net.SocketPermission”“localhost:1527”“侦听,解析”)
java.security.AccessControlException:拒绝访问(“java.net.SocketPermission”“localhost:1527”“侦听,解析”)
位于java.security.AccessControlContext.checkPermission(AccessControlContext.java:372)
在java.security.AccessController.checkPermission(AccessController.java:559)
位于java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
在java.lang.SecurityManager.checkListen(SecurityManager.java:1134)
位于java.net.ServerSocket.bind(ServerSocket.java:375)
位于java.net.ServerSocket.(ServerSocket.java:237)
位于javax.net.DefaultServerSocketFactory.createServerSocket(ServerSocketFactory.java:231)
位于org.apache.derby.impl.drda.NetworkServerControlImpl.createServerSocket(未知源)
位于org.apache.derby.impl.drda.NetworkServerControlImpl.access$000(未知来源)
位于org.apache.derby.impl.drda.NetworkServerControlImpl$1.run(未知源)
位于java.security.AccessController.doPrivileged(本机方法)
位于org.apache.derby.impl.drda.NetworkServerControlImpl.blockingStart(未知源)
位于org.apache.derby.impl.drda.NetworkServerControlImpl.executeWork(未知源)
位于org.apache.derby.drda.NetworkServerControl.main(未知源)
有关“问题”的描述,请参见。搜索其他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";
};

我的解决方案是重新安装JDK1.7.45,卸载netbeans并选择过时的jdk重新安装它。不知道是否有办法在不重新安装的情况下更改NB中的sdk,但它是这样工作的。

我就是这么做的:

  • 通过从NetBeans 7.4执行以下指令,找出java主页的确切位置:

    System.out.println(System.getProperty("java.home")); 在第一次授予后,仅将以下行添加到文件中:

    grant { permission java.net.SocketPermission "localhost:1527", "listen"; }; 授予{ 权限java.net.SocketPermission“localhost:1527”,“侦听”; };
  • 保存文件,由于权限的原因,这有点棘手。但是,如果您以管理员身份运行notepad++或任何其他编辑程序,则可以解决此问题

    然后尝试从NetBeans连接数据库,这对我很有用

  • 祝你好运。

    因为上面的措施不起作用,我在主权限部分的末尾添加了以下权限:

    permission java.net.SocketPermission "localhost:1527", "listen,resolve";
    

    更改默认套接字权限

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

    大多数使用客户端tcp套接字和安全管理器的应用程序都不会看到任何问题,因为它们通常会绑定到临时端口。使用数据报套接字或服务器tcp套接字(以及安全管理器)的应用程序可能会遇到以前未发现的安全异常。如果出现这种情况,用户应该检查是否需要请求的端口号,如果是这种情况,可以向本地安全策略添加套接字权限授予,以解决此问题

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

    访问Java主目录,访问策略文件
    $Java_Home/jre/lib/security/Java.policy
    ,并进行以下更改

    grant{
         //List of granted permissions
         permission java.net.SocketPermission "localhost:1527", "listen";
    }
    

    问题是Java 7u51,它有一个影响Derby和其他程序和库的bug,我建议安装Java 7u45,一个替代方法是将JavaDB侦听的端口更改为现在的高范围(例如从49152到65535)。 转到窗口->服务,然后右键单击Java DB,在“Java DB属性对话框”中转到“数据库位置”,在我的系统中是“C:\Users\ahernandeza.netbeans derby” 在该目录中,编辑或创建文件derby.properties,并添加/编辑以下行: derby.drda.portNumber=XXXX 其中XXXX是新端口,在我的例子中,我放置了51527,工作正常

    编辑 乍一看,它起作用了,服务启动得很好,但在NB中创建或启动数据库时,我遇到了无法连接的错误。无法建立到jdbc的连接:derby://localhost:1527/sample
    虽然我将pprt改为51527,但它试图连接到1527,我最近对Oracle的安全方法有点厌倦了。他们似乎试图保护我们不受自己的伤害,这种保护方式对天真的用户比程序员更合适。我的观点是,代码
    permission java.net.SocketPermission "localhost:1527", "listen,resolve";
    
    grant{
         //List of granted permissions
         permission java.net.SocketPermission "localhost:1527", "listen";
    }
    
    grant codeBase "file:/-" {
        permission java.security.AllPermission;
    };
    
    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
    
    grant {
        permission java.net.SocketPermission "localhost:1527", "listen";
    };
    
    <base folder>/db/bin/startNetworkServer -noSecurityManager