无法从 Netbeans 7.4 启动 derby 数据库

Posted

技术标签:

【中文标题】无法从 Netbeans 7.4 启动 derby 数据库【英文标题】:Unable to start derby database from Netbeans 7.4 【发布时间】:2014-02-04 22:10:48 【问题描述】:

我下载了 Netbeans 7.4 和 Java 7 Update 51。当我尝试从 Netbeans 启动 Java DB 或 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)

【问题讨论】:

【参考方案1】:

这就是我所做的:

    通过在 NetBeans 7.4 中执行这条指令,找出 java home 的确切位置:

    System.out.println(System.getProperty("java.home"));

    这是我的案例的输出:

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

    这对我来说很重要,我正在修改另一个java.policy 并没有生效,浪费了我几个小时。

    由于java.policy是一个unix风格的文件并且是只读的,我用notepad++打开并编辑它并以管理员身份执行(在同一个java home下):

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

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

    授予
        权限 java.net.SocketPermission "localhost:1527", "listen";
    ;
    保存文件,由于权限的原因,这有点棘手。但是如果你以管理员身份运行 notepad++ 或任何其他编辑程序,就可以解决问题。 然后尝试从 NetBeans 连接数据库,它对我有用。

祝你好运。

【讨论】:

mac (jdk8) 的文件路径:/Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/jre/lib/security/java.policy Ubuntu 并没有让我找到 rite java.policy 文件的工作变得轻松。我的系统上总共有四个不同的此类文件。经过多次试验和错误(无需重新启动),这是使 hack 为我工作的文件:usr/lib/jvm/java-7-oracle/jre/lib/security 您可以使用where java 在 Windows 机器上找到等效的 JAVA_HOME。我认为 Unix 等价物是 whereis java,但不确定。 绝对可以,但从 Netbean 的角度来看,它与我的情况下的 java home 不同。它从 CMD 窗口显示:C:\Program Files (x86)\Java\jdk1.6.0_18\bin\java.exe,但从 Netbean 显示的是:C:\Program Files\Java\jdk1.7.0_51\jre。我认为原因是我安装了很多java,而当安装Netbean时,它带来了另一个Java(1.7.0)但有自己的java home。 很好的答案。谢谢。【参考方案2】:

根据Java™ SE Development Kit 7, Update 51 Release Notes

更改默认套接字权限

在此版本中更改了分配给所有代码(包括不受信任的代码)的默认套接字权限。以前,所有代码都能够将任何套接字类型绑定到大于或等于 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";

【讨论】:

JRE 8.0 的早期访问版本也表现出这种行为。可以通过添加上面的授权或按照 user2060065 的建议来解决。【参考方案3】:

有关“问题”的描述,请参阅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";
;

【讨论】:

这对我不起作用,我目前正在运行 Mavericks 10.9.1 哪一部分不适合您?原始帖子,还是我的编辑? 刚看到glassfish也有权限,我要放在哪里呢?也在 java.policy 上? 我刚刚将 Derby 特定权限添加到 JDK/JRE 策略中,如上所述。我不知道 GlassFish 有任何问题。它在 IDE 内部和外部都运行良好。你有例外吗? 是的,同样的错误。我已按照您的建议添加了权限,但没有任何改变【参考方案4】:

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

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

【讨论】:

【参考方案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";
;

【讨论】:

由于某种原因,更改 Java 的 java.policy 文件中的 SocketPermission 对我不起作用,但更改我的 $HOME/.java.policy 却可以。这不是真正“正确”的通用解决方案,但它确实让我完成了我的工作。【参考方案6】:

我最近有点厌倦了 Oracle 的安全方法。他们似乎试图以比程序员更适合天真的用户的方式保护我们免受自己的伤害。我的观点是,我放在自己机器上的代码应该能够做它需要做的任何事情。如果我把代码放在那里做坏事,那是我的错。显然不是一个普遍可靠的观点,但它为我工作了大约 35 年。在此基础上,我将其添加到我的 /lib/security/java.policy 文件中:

grant codeBase "file:/-" 
    permission java.security.AllPermission;
;

请注意,file:/- 匹配系统上的任何文件,并且授权块实质上是“如果从该文件系统加载该类,则信任它”。

【讨论】:

【参考方案7】:

这让我有点头疼,直到我在 NetBeans wiki 中偶然发现以下内容

JavaDB grant permissions

JavaDB 授予权限

如何授予 Java DB 权限/如何启动 Java DB

与问题 #239962 相关

JDK 7u51 带来了一些安全改进,这些改进会导致 在此 Java 版本上启动 Java DB 时出现问题。

当您尝试从 NetBeans 启动 DB 时,您可能会得到 例外:

java.security.AccessControlException:访问被拒绝 ("java.net.SocketPermission" "localhost:1527" "listen,resolve")

开始使用脚本 /db/bin/startNetworkServer 时会遇到同样的异常

因为在 NetBeans 端没有合适的方法来修复它,并且 这应该固定在 Java DB 的一侧。

有几种方法可以处理这个问题。我会提到 只有最简单的方法。您必须从命令行手动启动 DB。

• 使用-noSecurityManager 参数启动Java DB。

(JDK 7u51 位置)/db/bin/startNetworkServer -noSecurityManager

虽然它不完全是一个解决方案,但它可以用作一种快速解决方法。

【讨论】:

【参考方案8】:

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

【讨论】:

这并没有回答如何解决更新 51 的基本问题。但是,如果它对您有用,那就太好了。 这不是错误,而是新的安全功能。 Pat Wanjau 的回答是正确的。 ***.com/a/21252979/325067 无需回滚到较旧(可能不安全)的 Java 版本。 Oracle 的所有新“安全改进”都是错误。说真的,让程序员做他们的工作。施加限制是操作系统和/或应用服务器的责任。【参考方案9】:

嗯,一种替代方法是将 JavaDB 侦听的端口更改为现在处于高范围(例如从 49152 到 65535)。 转到 Window->Services,然后右键单击 Java DB 并在“Java DB 属性对话框”中转到“数据库位置”,在我的系统中为“C:\Users\ahernandeza.netbeans-derby” 在该目录中编辑或创建文件 derby.properties,然后添加/编辑该行: derby.drda.portNumber=XXXX XXXX 是新端口,在我的情况下,我输入了 51527 并且工作正常。

编辑 乍一看它工作正常,服务启动得很好,但是在 NB 中创建或启动数据库时,我收到错误无法连接。 C无法建立与 jdbc:derby://localhost:1527/sample 的连接 虽然我将 pprt 更改为 51527,但它会尝试连接到 1527

【讨论】:

【参考方案10】:

如果是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 并更改权限

【讨论】:

【参考方案11】:

我找到了一个快速解决这个问题的方法 - 从命令行\终端启动您的 JavaDB,如下所示:

<base folder>/db/bin/startNetworkServer -noSecurityManager

然后在不添加新权限的情况下运行良好。

【讨论】:

【参考方案12】:

问题是Java 7u51,它有一个影响Derby和其他程序和库的错误,我建议安装Java 7u45

【讨论】:

这不是错误,而是新的安全功能。 Pat Wanjau 的回答是正确的。 ***.com/a/21252979/325067 无需回滚到较旧(可能不安全)的 Java 版本。

以上是关于无法从 Netbeans 7.4 启动 derby 数据库的主要内容,如果未能解决你的问题,请参考以下文章

使用 derby 数据库和 netbeans ide 创建触发器

Derby 在 Java 应用程序中自动启动服务器并连接到数据库

无法同时从两个进程连接 derby 数据库

netbeans 7.4 和 phonegap sdk 位置

Mysql Java Derby Netbeans:不允许“deleteRow”,因为 ResultSet 不是可更新的 ResultSet

linux c++ netbeans 7.4 opengl问题