it-swarm.com.ru

Невозможно запустить базу данных 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 propertiesJava db properties

54
Superman9999

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

  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

    Добавьте только эти строки в файл после первого гранта:

    предоставить {
     разрешение Java.net.SocketPermission "localhost: 1527", "listen"; 
    };
  3. Сохраните файл, который немного сложнее из-за разрешения. Но если вы запустите notepad ++ или любую другую программу редактирования от имени администратора, вы можете решить эту проблему.

    Затем попробуйте подключить базу данных из NetBeans, она у меня работает.

Удачи.

107
user2060065

Согласно Java ™ SE Development Kit 7, примечания к выпуску обновления 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";
}
31
Patrick W

Смотрите 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;
};

Обратите внимание, что это мое требование.

Я даю разрешение на запуск Derby каждому приложению, использующему U51 JRE.

РЕДАКТИРОВАТЬ

Альтернативой может быть использование менее разрешительного набора разрешений, таких как:

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";
};
15
Chuk Lee

Вы также можете решить эту проблему для каждого пользователя, предоставив необходимые разрешения в файле с именем .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
Andrea

Поскольку верхние меры не работали, я добавил следующее разрешение в конец основного раздела разрешений:

permission Java.net.SocketPermission "localhost:1527", "listen,resolve";
5
LeoTom

Это занимало мою голову некоторое время, пока я не наткнулся на следующее в вики NetBeans

Разрешения на предоставление JavaDB

Разрешения на предоставление JavaDB

Как предоставить разрешения для Java БД/Как запустить Java БД

По вопросу № 239962

JDK 7u51 поставляется с некоторыми улучшениями безопасности, которые вызывают проблемы с запуском Java БД в этой Java версии.

Когда вы попытаетесь запустить БД из NetBeans, вы, вероятно, получите исключение:

Java.security.AccessControlException: доступ запрещен ("Java.net.SocketPermission" "localhost: 1527" "прослушать, разрешить")

То же исключение вы получите при запуске скрипта/db/bin/startNetworkServer

Потому что нет подходящего способа исправить это на стороне NetBeans, и это должно быть исправлено на стороне Java БД.

Есть несколько способов справиться с этой проблемой. Я упомяну только самый простой способ. Вы должны запустить БД вручную из командной строки.

• Запустить Java БД с аргументом -noSecurityManager.

(Расположение JDK 7u51)/db/bin/startNetworkServer -noSecurityManager

Хотя это не совсем решение, его можно использовать как быстрый обходной путь.

3
user3381021

В последнее время я немного устал от подхода Oracle к безопасности. Похоже, что они пытаются защитить нас от самих себя способами, которые были бы более подходящими для наивных пользователей, чем для программистов. Я считаю, что код, который я помещаю на свой компьютер, должен делать все, что ему нужно. Это моя вина, если я добавлю код, который делает плохие вещи. Ясно, что это не универсально надежная перспектива, но она работала для меня около 35 лет. Исходя из этого, я добавляю это в мой файл /lib/security/Java.policy:

grant codeBase "file:/-" {
    permission Java.security.AllPermission;
};

обратите внимание, что file:/- соответствует любому файлу в системе, и блок предоставления говорит, по сути, "если класс загружается из этой файловой системы, то доверяйте ему".

3
user230146

Ну, одна альтернатива - изменить порт, который слушает JavaDB, чтобы он находился в верхнем диапазоне (например, с 49152 до 65535). Перейдите в Window-> Services, затем щелкните правой кнопкой мыши Java DB и в "Диалоге свойств Java DB" перейдите к "Расположение базы данных", которое в моей системе называется "C:\Users\ahernandeza.netbeans-derby". В этом каталоге отредактируйте или создайте файл derby.properties и добавьте/отредактируйте строку: derby.drda.portNumber = XXXX Где XXXX - новый порт, в моем случае я поставил 51527 и работал просто отлично.

РЕДАКТИРОВАТЬ С первого взгляда это сработало, служба запустилась просто отлично, но при создании или запуске базы данных в NB я получил ошибку "Невозможно подключиться". Не удается установить соединение с jdbc: derby: // localhost: 1527/sample Хотя я изменил pprt на 51527, он пытается подключиться к 1527

0
Alejandro Hdez. Angeles

Если 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 и ​​меняет разрешения

0
test30

Я нашел быстрое решение этой проблемы - Запустите ваш JavaDB из командной строки\терминала так:

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

Затем он работает нормально, без добавления новых разрешений.

0
Daniel

Моим решением было переустановить JDK 1.7.45, удалить NetBeans и переустановить его, выбрав устаревший JDK. Не знаю, есть ли способ изменить sdk в NB без переустановки, но это сработало так.

0
user3206735