Не удается запустить базу данных derby из Netbeans 7.4
Я загрузил обновление Netbeans 7.4 и Java 7 51. Я получаю следующее сообщение об ошибке при попытке запустить Java DB или derby connection из Netbeans. Это на ПК с windows 8. Я загрузил версию для 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.access0(Unknown Source)
at org.apache.derby.impl.drda.NetworkServerControlImpl.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)


12 ответов:
вот что я сделал:
узнайте, где именно находится java home, выполнив эту инструкцию из NetBeans 7.4:
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добавить только эти строки в файл после первого гранта:
grant { permission java.net.SocketPermission "localhost:1527", "listen"; };- сохраните файл, который немного сложнее по причине разрешения. Но если вы запустите notepad++ или любую другую программу редактирования в качестве администратора, вы можете решить эту проблему.
затем попробуйте подключить базу данных из NetBeans, это работает для меня.удачи.
по данным Java™ SE Development Kit 7, Update 51 примечания к выпуску
изменение разрешений сокета по умолчанию
разрешения сокета по умолчанию, назначенные всему коду, включая ненадежный код, были изменены в этом выпуске. Ранее весь код был способен привязать любой тип сокета к любому номеру порта, большему или равному 1024. По-прежнему можно привязать сокеты к эфемерному диапазону портов на каждом система. Точный диапазон эфемерных портов варьируется от одной операционной системы к другой, но обычно он находится в высоком диапазоне (например, от 49152 до 65535). Новое ограничение заключается в том, что привязка сокетов за пределами эфемерного диапазона теперь требует явного разрешения в политике безопасности системы.
большинство приложений, использующих клиентские TCP-сокеты и менеджер безопасности, не увидят никаких проблем, поскольку они обычно привязываются к эфемерным портам в любом случае. Приложения, использующие сокеты дейтаграмм или TCP-сокеты сервера (и менеджер безопасности) могут столкнуться с исключениями безопасности, где они не были замечены ранее. Если это происходит, пользователи должны проверить, ожидается ли запрашиваемый номер порта, и если это так, то для решения проблемы в локальную политику безопасности можно добавить разрешение сокета.
Это означает, что вы должны явно установить разрешения для вашего приложения, чтобы иметь возможность доступа к диапазону портов между 1025 и 49151. Поэтому вы можете предоставить это разрешение, добавив эту строку в список предоставленных разрешений:
посетите свой домашний каталог Java и получите доступ к файлу политики по адресу
$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 для описания "проблемы". Поиск других-libs / javadb
в зависимости от вашего требования, что я сделал, было пойти и изменить политику безопасности по умолчанию
cd $JAVA_HOME/jre/lib/securityEdit
java.policy(сначала сделайте резервную копию!)добавить следующее
grant codeBase "file:${java.home}}/../db/lib/*" { permission java.security.AllPermission; };обратите внимание, что это мое требование.
Я предоставляю каждое приложение, которое использует u51 JRE разрешите начать дерби.
EDIT
альтернативой было бы использовать менее разрешительный набор разрешений, таких как:
grant codeBase "file:${java.home}}/../db/lib/*" { permission java.net.SocketPermission "localhost:1527", "listen,resolve"; };NetBeans по умолчанию использует версию derby, установленную с GlassFish. Так что мои разрешения выглядят так на Mac. Он будет похож на Windows, но путь нужно будет изменить.
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.политика файл:
grant codeBase "file:/-" { permission java.security.AllPermission; };обратите внимание, что файл:/- соответствует любому файлу в системе, и блок гранта говорит, по существу, "если класс загружен из этой файловой системы, то доверяйте ему".
Это делало мою голову немного, пока я не наткнулся на следующее В Вики NetBeans
JavaDB предоставить разрешения
JavaDB предоставить разрешения
Как предоставить разрешения для Java DB / как запустить Java DB
связано с проблемой #239962
JDK 7u51 поставляется с некоторыми улучшениями безопасности, которые вызывают проблемы с запуском JAVA DB на этой версии Java.
при попытке запустить БД из NetBeans вы, вероятно, получите Исключение:
java.безопасность.AccessControlException: отказано в доступе ("java. net. SocketPermission ""localhost: 1527 ""слушайте, разрешите")
такое же исключение вы получите при запуске с помощью script/db/bin / startNetworkServer
потому что нет подходящего способа исправить это на стороне NetBeans и это должно быть исправлено на стороне JAVA DB.
есть несколько способов, как справиться с этой проблемой. Я буду упоминать только самый простой способ. Вы должны запустить БД вручную из командной строки.
• запустите JAVA DB с аргументом-noSecurityManager.
(расположение JDK 7u51) / db / bin/startNetworkServer-noSecurityManager
хотя это не совсем решение, оно может использоваться как быстрый обходной путь.
моим решением было переустановить jdk 1.7.45, удалить netbeans и переустановить его, выбрав устаревший jdk. Не знаю, есть ли способ изменить sdk в NB без переустановки, но он работал таким образом.
Ну, одна альтернатива-изменить порт, который слушает JavaDB, чтобы быть теперь в высоком диапазоне (например, от 49152 до 65535). Перейдите в окно - > службы, затем щелкните правой кнопкой мыши Java DB и в" диалоге свойств Java DB "перейдите в" расположение базы данных", которое в моей системе "C:\Users\ahernandeza.netbeans-дерби" В этом каталоге отредактируйте или создайте файл derby.свойства и добавление / редактирование строки: котелок.drda.portNumber=XXXX Где XXXX-это новый порт, в моем случае я поставил 51527 и работал просто штраф.
изменить На первый взгляд fisrt это сработало, служба началась просто отлично, но при создании или запуске базы данных в NB, я получил ошибку не удается подключиться. Не удается установить соединение с 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".*/\n\tpermission java.net.SocketPermission "localhost:1527", "listen";/}' $file cat $fileон автоматически находит вашу java и изменяет разрешения
Я нашел быстрое решение этой проблемы - Запустите JavaDB из командной строки\terminal следующим образом:
<base folder>/db/bin/startNetworkServer -noSecurityManagerзатем он работает нормально без добавления новых разрешений.
проблема в Java 7u51, у него есть ошибка, которая влияет на Derby и другие программы и библиотеки, я предлагаю установить Java 7u45
Comments