Не удается запустить базу данных 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)


connection propertiesjava db properties

775   12  

12 ответов:

вот что я сделал:

  1. узнайте, где именно находится java home, выполнив эту инструкцию из NetBeans 7.4:

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

    это выход для моего случая:

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

    что очень важно для меня, я модифицировал другой java.policy и не возымел никакого эффекта и потратил меня впустую пару часов.

  2. по причине 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";
    };
  3. сохраните файл, который немного сложнее по причине разрешения. Но если вы запустите 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/security

Edit 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

    Ничего не найдено.