Impossible de démarrer la base de données Derby à partir de Netbeans 7.4
J'ai téléchargé Netbeans 7.4 et Java 7 Update 51. Je reçois l'erreur ci-dessous lorsque j'essaie de démarrer une connexion Java DB ou Derby à partir de Netbeans. C'est sur un PC windows 8. J'ai téléchargé la version pour windows XP 32 bits au travail. Il fonctionne très bien. Je ne suis pas sûr de ce qui est manquant.
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)
12 réponses
C'est ce que j'ai fait:
-
Découvrez exactement où se trouve la maison java en exécutant cette instruction à partir de NetBeans 7.4:
System.out.println(System.getProperty("java.home"));
C'est la sortie pour mon cas:
C:\Program Files\Java\jdk1.7.0_51\jre
Ce qui est assez important pour moi, je modifiais un autre
java.policy
et n'a pris aucun effet et m'a gaspillé quelques heures. -
Pour la raison de
java.policy
est un fichier de style unix et en lecture seule, je l'ai ouvert et édité avec notepad++ et exécuté en tant qu'administrateur (sous le même java accueil):C:\Program Files\Java\jdk1.7.0_51\jre\lib\security\java.policy
Ajoutez uniquement ces lignes dans le fichier après la première attribution:
grant { permission java.net.SocketPermission "localhost:1527", "listen"; };
- enregistrez le fichier, ce qui est un peu délicat en raison de l'autorisation. Mais si vous lancez notepad++ ou tout autre programme d'édition en tant qu'administrateur, vous pouvez résoudre le problème.
ensuite, essayez de connecter la base de données à partir de NetBeans, cela fonctionne pour moi.
Bonne chance.
Selon Java SE Development Kit 7, mise à Jour 51 Notes de Version
Modification des autorisations de Socket par défaut
Les autorisations de socket par défaut attribuées à tout le code, y compris le code non approuvé, ont été modifiées dans cette version. Auparavant, tout le code était capable de lier n'importe quel type de socket à n'importe quel numéro de port supérieur ou égal à 1024. Il est toujours possible de lier des sockets à la plage de ports éphémères sur chaque système. La gamme exacte de l'éphémère ports varie d'un système d'exploitation à l'autre, mais il est généralement dans la gamme élevée (comme de 49152 à 65535). La nouvelle restriction est que la liaison de sockets en dehors de la plage éphémère nécessite maintenant une autorisation explicite dans la stratégie de sécurité du système.
La plupart des applications utilisant des sockets TCP clients et un gestionnaire de sécurité ne verront aucun problème, car celles-ci se lient généralement à des ports éphémères de toute façon. Applications utilisant des sockets de datagramme ou des sockets TCP de serveur (et gestionnaire) peut rencontrer des exceptions de sécurité où aucune n'a été vu auparavant. Si cela se produit, les utilisateurs doivent vérifier si le numéro de port demandé est attendu, et si c'est le cas, une autorisation de socket peut être ajoutée à la stratégie de sécurité locale, pour résoudre le problème.
Cela signifie que vous devez explicitement définir les autorisations pour que votre demande puisse être en mesure d'accéder aux ports de gamme entre 1025 et 49151. Vous pouvez donc accorder cette autorisation en ajoutant cette ligne dans la liste des autorisations accordées:
Visitez votre répertoire de base Java et accédez à votre fichier de stratégie à $JAVA_HOME/jre/lib/security/java.policy
et effectuez les modifications suivantes.
grant{
//List of granted permissions
permission java.net.SocketPermission "localhost:1527", "listen";
}
Voir http://www.oracle.com/technetwork/java/javase/7u51-relnotes-2085002.html pour la description du "problème". Rechercher autre-libs / javadb
En fonction de vos besoins, ce que j'ai fait était d'aller modifier la Politique de sécurité par défaut
cd $JAVA_HOME/jre/lib/security
Modifier java.policy
(faites d'abord une sauvegarde!)
Ajouter
grant codeBase "file:${java.home}}/../db/lib/*" {
permission java.security.AllPermission;
};
Notez que c'est mon exigence.
J'accorde à chaque application qui utilise le JRE u51 la permission de démarrer Derby.
Modifier
L'alternative serait d'utiliser un ensemble d'autorisations moins permissives comme:
grant codeBase "file:${java.home}}/../db/lib/*" {
permission java.net.SocketPermission "localhost:1527", "listen,resolve";
};
NetBeans, par défaut, utilise la version Derby installée avec GlassFish. Donc, mes autorisations ressemblent à ceci sur le Mac. Ce sera similaire sur Windows, mais le chemin devra changer.
grant codeBase "file:/Applications/NetBeans/glassfish-4.0/javadb/lib/*" {
permission java.net.SocketPermission "localhost:1527", "listen,resolve";
};
Parce que les mesures supérieures n'ont pas fonctionné, j'ai ajouté l'autorisation suivante à la fin de la section d'autorisation principale:
permission java.net.SocketPermission "localhost:1527", "listen,resolve";
Vous pouvez également résoudre le problème sur une base par utilisateur en accordant l'autorisation nécessaire dans un fichier appelé .java.policy
dans votre répertoire personnel.
Fonctionne sur les systèmes Unix et Windows comme documenté ici: http://docs.oracle.com/javase/7/docs/technotes/guides/security/PolicyFiles.html
Cela peut être utile si le fichier de stratégie à l'échelle du système est écrasé, par exemple lors de la mise à jour de votre JDK, ou si vous n'avez pas l'autorisation de modifier le fichier système.
C'est ce que je dans mon $HOME/.java.policy
:
grant {
permission java.net.SocketPermission "localhost:1527", "listen";
};
J'en ai un peu marre de L'approche D'Oracle en matière de sécurité ces derniers temps. Ils semblent essayer de nous protéger de nous-mêmes d'une manière qui serait plus appropriée aux utilisateurs naïfs que aux programmeurs. Mon point de vue est que le code que je mets sur ma propre machine devrait être capable de faire tout ce dont il a besoin. C'est ma faute si je mets du code là-bas qui fait de mauvaises choses. Il est clair que ce n'est pas une perspective universellement fiable, mais cela a fonctionné pour moi pendant environ 35 ans. Sur cette base, j'ajoute ceci à mon /lib/security/java.politique fichier:
grant codeBase "file:/-" {
permission java.security.AllPermission;
};
Notez que le fichier: / - correspond à n'importe quel fichier sur le système, et le bloc grant dit, en substance, "si la classe est chargée à partir de ce système de fichiers, alors faites-la confiance".
Cela faisait un peu ma tête jusqu'à ce que je tombe sur ce qui suit dans le Wiki NetBeans
JavaDB accorder des autorisations
Autorisations d'octroi JavaDB
Comment accorder des autorisations pour Java DB / Comment démarrer Java DB
Lié au numéro # 239962
JDK 7u51 est livré avec quelques améliorations de sécurité qui causent problèmes avec le démarrage de Java DB sur cette version Java.
Lorsque vous essayez de démarrer DB à partir de NetBeans vous obtiendrez probablement le Exception:
Java.sécurité.AccessControlException: Accès refusé ("java. net. SocketPermission ""localhost: 1527 ""écouter, résoudre")
La même exception que vous obtiendrez lors du démarrage de script / db/bin / startNetworkServer
Parce Qu'il n'y a pas de moyen approprié de le réparer du côté NetBeans et cela devrait être corrigé du côté de la base de données Java.
Il existe plusieurs façons de traiter ce problème. Je vais parler de seulement le moyen le plus facile. Vous devez démarrer DB manuellement à partir de la ligne de commande.
* démarrez Java DB avec l'argument-noSecurityManager.
(emplacement JDK 7u51)/db/bin / startNetworkServer-noSecurityManager
Bien que ce ne soit pas exactement une solution, il est utilisable comme une solution de contournement rapide.
Ma solution à cela était de réinstaller jdk 1.7.45, désinstaller netbeans et le réinstaller en sélectionnant le JDK obsolète. Je ne sais pas s'il existe un moyen de changer le sdk en NB sans le réinstaller mais cela a fonctionné de cette façon.
Eh bien, une alternative est de changer le port JavaDB écoute, pour être maintenant dans la gamme élevée (comme de 49152 à 65535). Allez dans fenêtre- > Services, puis cliquez avec le bouton droit sur Java DB et dans "Java DB Properties Dialog" allez à "Database Location", qui dans mon système est "C:\Users\ahernandeza.netbeans-derby" Dans ce répertoire modifier ou créer le fichier derby.propriétés et ajouter/modifier la ligne: derby.drda.portNumber = XXXX Où XXXX est le nouveau port, dans mon cas, je mets 51527 et a travaillé juste fin.
Modifier Au premier coup d'œil, cela a fonctionné, le service a très bien commencé, mais lors de la création ou du démarrage d'une base de données au NB, j'ai eu L'erreur Impossible de me connecter. Impossible d'établir une connexion jdbc:derby://localhost:1527/échantillon Bien que j'ai changé le pprt en 51527, il essaie de se connecter à 1527
Si linux, alors
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
Il trouve automatiquement votre java et modifie les autorisations
J'ai trouvé une solution rapide à ce problème - Démarrez votre JavaDB à partir de la ligne de commande \ terminal comme suit:
<base folder>/db/bin/startNetworkServer -noSecurityManager
Ensuite, il fonctionne bien sans ajouter de nouvelles autorisations.
Le problème est la Java 7u51, il ont un bug qui affecte Derby et d'autres programmes et bibliothèques, je suggère d'installer le Java 7u45