无法从Netbeans 7.4启动derby数据库

时间:2014-01-16 06:02:31

标签: java netbeans derby

我下载了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)

connection properties java db properties

12 个答案:

答案 0 :(得分:107)

这就是我所做的:

  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样式文件而且只读,我用notepad ++打开并编辑它并以管理员身份执行(在同一个java主目录下):

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

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

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

    然后尝试从NetBeans连接数据库,它对我有用。
  4. 祝你好运。

答案 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 grant permissions

  

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