Не удалось запустить базу данных derby из Netbeans 7.4
Я загрузил Netbeans 7.4 и Java 7 Update 51. Я получаю следующую ошибку при попытке запустить Java DB или derby соединение с 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.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]()
Ответы
Ответ 1
Это то, что я сделал:
-
Узнайте, где именно находится дом java, выполнив эту инструкцию из NetBeans 7.4:
System.out.println(System.getProperty("java.home"));
Это вывод для моего случая:
C:\Program Files\Java\jdk1.7.0_51\jre
что для меня очень важно, я изменял еще один java.policy
и ничего не делал и потратил пару часов.
-
По причине java.policy
является файлом стиля unix и доступен только для чтения, я открыл и отредактировал его с помощью блокнота ++ и выполнил его как администратор (под тем же самым java-адресом):
C:\Program Files\Java\jdk1.7.0_51\jre\lib\security\java.policy
Добавьте только эти строки в файл после первого гранта:
grant {
permission java.net.SocketPermission "localhost:1527", "listen";
};
- Сохраните файл, что немного сложно по причине разрешения. Но если вы запускаете notepad ++ или любую другую программу редактирования в качестве администратора, вы можете решить эту проблему.
Тогда попробуйте подключить базу данных из NetBeans, она работает для меня.
Удачи.
Ответ 2
Согласно Java ™ SE Development Kit 7, заметки о выпуске обновления 51
Изменение разрешений сокета по умолчанию
Разрешения сокета по умолчанию, назначенные для всего кода, включая ненадежный код, были изменены в этой версии. Раньше весь код мог связывать любой тип сокета с любым номером порта, большим или равным 1024. По-прежнему можно связывать сокеты с эфемерным диапазоном портов в каждой системе. Точный диапазон эфемерных портов варьируется от одной операционной системы к другой, но обычно она находится в большом диапазоне (например, от 49152 до 65535). Новое ограничение заключается в том, что привязка сокетов за пределами эфемерного диапазона теперь требует явного разрешения в политике безопасности системы.
Большинство приложений, использующих клиентские сокеты tcp и диспетчер безопасности, не будут видеть никаких проблем, так как они обычно привязаны к эфемерным портам. Приложения, использующие сокеты datagram или серверные сокеты tcp (и диспетчер безопасности), могут сталкиваться с исключениями безопасности, когда их никто не видел раньше. Если это происходит, пользователи должны проверить, будет ли ожидаемый номер порта запрашиваться, и если это так, разрешение разрешения сокета может быть добавлено в локальную политику безопасности для устранения проблемы.
Это означает, что вы должны явно указать разрешения для вашего приложения, чтобы иметь доступ к диапазону портов между 1025 и 49151. Поэтому вы можете предоставить это разрешение, добавив эту строку в список предоставленных разрешений:
Посетите свой домашний каталог Java и получите доступ к файлу политики в $JAVA_HOME/jre/lib/security/java.policy
и внесите следующие изменения.
grant{
//List of granted permissions
permission java.net.SocketPermission "localhost:1527", "listen";
}
Ответ 3
См. http://www.oracle.com/technetwork/java/javase/7u51-relnotes-2085002.html для описания "проблемы". Поиск других-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. Таким образом, мои разрешения выглядят так на Mac. Он будет похож на Windows, но путь должен измениться.
grant codeBase "file:/Applications/NetBeans/glassfish-4.0/javadb/lib/*" {
permission java.net.SocketPermission "localhost:1527", "listen,resolve";
};
Ответ 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";
};
Ответ 6
Я немного устал от подхода Oracle к безопасности в последнее время. Кажется, они пытаются защитить нас от самих себя способами, которые были бы более подходящими для наивных пользователей, чем программисты. Я считаю, что код, который я накладываю на свою собственную машину, должен иметь возможность делать все, что нужно. Это моя вина, если я там ставил там код, который делает плохие вещи. Ясно, что это не универсально надежная перспектива, но она работала для меня около 35 лет. Исходя из этого, я добавляю это в файл /lib/security/java.policy:
grant codeBase "file:/-" {
permission java.security.AllPermission;
};
обратите внимание, что файл:/- соответствует любому файлу в системе, и блок-грант говорит, по существу, "если класс загружен из этой файловой системы, тогда доверяйте ему".
Ответ 7
Это немного помолодело, пока я не наткнулся на следующее в вики NetBeans
Права доступа к JavaDB
Разрешения на предоставление разрешений JavaDB
Как предоставить разрешения для Java DB/Как запустить Java DB
Связано с проблемой # 239962
JDK 7u51 поставляется с некоторыми улучшениями в области безопасности, которые вызывают проблемы с запуском Java DB на этой версии Java.
Когда вы пытаетесь запустить БД из NetBeans, вы, вероятно, получите Исключение:
java.security.AccessControlException: доступ запрещен ( "java.net.SocketPermission" "localhost: 1527" "слушать, решать" )
То же самое исключение вы получите при запуске с помощью script/db/bin/startNetworkServer
Потому что нет подходящего способа исправить это на стороне NetBeans и это должно быть исправлено на стороне Java DB.
Существует несколько способов решения этой проблемы. Я остановлюсь только самый простой способ. Вы должны запустить БД вручную из командной строки.
• Запустите Java DB с аргументом -noSecurityManager.
(местоположение JDK 7u51)/db/bin/startNetworkServer -noSecurityManager
Хотя это не совсем решение, оно можно использовать в качестве быстрого решения.
Ответ 8
Моим решением было переустановить jdk 1.7.45, удалить netbeans и переустановить его, выбрав устаревший jdk. Не знаю, есть ли способ изменить sdk в NB, не переустанавливая его, но он работал таким образом.
Ответ 9
Ну, одна из альтернатив заключается в том, чтобы изменить порт JavaDB, который прослушивается, чтобы теперь находиться в высоком диапазоне (например, от 49152 до 65535).
Перейдите в Window- > Services, затем щелкните правой кнопкой мыши Java DB и в "Java DB Properties Dialog" перейдите к "Расположение базы данных", который в моей системе "C:\Users\ahernandeza.netbeans-derby"
В этом каталоге отредактируйте или создайте файл derby.properties и добавьте/отредактируйте строку:
derby.drda.portNumber = XXXX
Где XXXX - новый порт, в моем случае я поставил 51527 и работал отлично.
ИЗМЕНИТЬ
С первого взгляда он работал, сервис начался очень хорошо, но при создании или запуске базы данных в NB я получил ошибку "Не удалось подключиться". CA не установить соединение с 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 из командной строки \terminal следующим образом:
<base folder>/db/bin/startNetworkServer -noSecurityManager
Затем он работает нормально, не добавляя новые разрешения.
Ответ 12
Проблема заключается в Java 7u51, у нее есть ошибка, которая влияет на Derby и другие программы и библиотеки, я предлагаю установить Java 7u45