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)

propriétés de connexionpropriétés java db

53
demandé sur Superman9999 2014-01-16 10:02:31

12 réponses

C'est ce que j'ai fait:

  1. 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.

  2. 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";
    };
  3. 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.

107
répondu user2060065 2014-06-29 12:54:36

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";
}
31
répondu Pat Wanjau 2014-01-21 08:38:12

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";
};
15
répondu Chuk Lee 2014-01-17 13:51:58

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";
5
répondu LeoTom 2014-01-20 21:24:30

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";
};
5
répondu Andrea 2014-04-08 11:16:47

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".

3
répondu user230146 2014-02-21 01:41:05

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.

3
répondu user3381021 2014-03-04 22:06:49

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.

0
répondu user3206735 2014-01-17 13:17:30

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

0
répondu Alejandro Hdez. Angeles 2014-02-14 16:32:31

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

0
répondu test30 2014-05-03 16:27:46

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.

0
répondu Daniel 2015-01-11 00:24:34

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

-2
répondu Gianluigi Pierini 2014-01-24 14:15:57