Débutante JAVA : Erreur

Gaëlle -  
 soregh -
Bonjour à tous,

Je viens de faire un petit pgm "hello world" en java (C'est ma 1ere expérience en matière de prog).
Quand je lance le serveur j'ai l'erreur suivante :

java.security.AccessControlException: access denied
(java.net.SocketPermission 127.0.0.1:1099 connect,resolve)


J'ai trouvé sur le Net la solution, mais je n'arrive pas à comprendre ce qu'il faut faire (créer des fichiers? où ça? juste les modifier?..etc) Est ce quelqu'un pourrait me traduire de façon simple le etxte ci dessous pour savoir ce que je dois faire? merci d'avance...c'est un projet que je dois avoir terminé mercredi :(

Lorsque l'on essaie d'utiliser un SecurityManager, on obtient le message d'erreur suivant :
java.security.AccessControlException: access denied
(java.net.SocketPermission 127.0.0.1:1099 connect,resolve)


Modification par programme
System.setSecurityManager (new RMISecurityManager() {
public void checkConnect (String host, int port) {}
public void checkConnect (String host, int port, Object context) {}
});



Le fichier .java.policy
Les permissions du SecurityManager sont spécifiées dans l'ordre :

dans le fichier java.policy de ${java.home}/lib/security/java.policy

puis dans

${user.home}/.java.policy (attention au point !)

Les instructions du fichier policy
Le serveur doit pouvoir accepter des connexions d'un hôte particulier :

permission java.net.SocketPermission "sace.essi;fr", "accept";

ou de tous les hôtes et pouvoir faire resolve également :

permission java.net.SocketPermission "*", "accept, resolve";

Pour définir cela, lancer la commande (sous jdk/bin) (voir aussi "A quick look at policytool"):

policytool

et éditer le fichier .java.policy (sous Linux sous ~, sur PC sur c:\winnt\profiles\votreNomuser)


Merci encore pour votre aide

Gaëlle
A voir également:

45 réponses

Gaëlle
 
youpi!! ça marche!!!

C:\TEST>java rmidemo.HelloMain 192.168.0.5:1099
Le message est: Hello World!


mais que à partir de mon pc...
J'ai tapé la ligne de commande sur mon autre pc et j'ai une erreur .

Sur l'autre pc, faut que je me mette à un endroit particulier pour lancer le client? Il faut faire quoi en fait?

Gaëlle (benzounette@hotmail.com)
0
silfaxu Messages postés 102 Date d'inscription   Statut Contributeur Dernière intervention   11
 
C'est quoi le message d'erreur sur ton autre PC ? ;-))

sfx
0
Gaëlle
 
Exception in thread "main" java.lang.NoClassDefFoundError: rmidemo/HelloMain

voilà l'erreur...

mais je viens de voir dans un bouquin ceci :

Pour appeler une méthode distante, le client doit en 1er lieu extraire une référence distante à l'objet visé. Il lui faut appeler la méthode lookup() du "registry". La procédure de dénomination est propre à chaque "registry": pour sa part la classe java.rmi.Naming localise les objets grâce à des URL similaires aux URL HTTP

object 01 = Naming.lookup("rmi://metalab.unc.edu:2048.fibonnaci");

Avant de manipuler un objet, il faut impérativement le convertir pour l'interface distante qu'il implémente (et non la véritable classe à laquelle le clientn'a pas accès):

Fibonacci calculateur = (Fibonacci) Naming.lookup("fibonacci");

Alors j'ai modifié le client :

public static void main(String[] args) {
try {
Hello obj = (Hello)Naming.lookup("rmi//"+args[0]+"/HelloServer");
String message = obj.sayHello();
System.out.println("Le message est: "+message);
} catch (Exception e) {
System.out.println("HelloMain exception: "+e.getMessage());
e.printStackTrace();
}
}


}

sur le pc où j'ai tout, sous D:/ j'ai créé le rep rmitest où j'ai copié : Hello.class, HelloImpl_Stub.class et HelloMain.class

Ensuite je lance la cmd dd'exécution du client à partir de D:/rmitest et voilà ce que j'obtiens :

D:\RMITEST>java HelloMain rmi://192.168.0.5:1099/HelloServeur
Exception in thread "main" java.lang.NoClassDefFoundError: HelloMain (wrong name
: rmidemo/HelloMain)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)


Décidément on y arrivera jamais! ;(

Gaëlle
0
silfaxu Messages postés 102 Date d'inscription   Statut Contributeur Dernière intervention   11
 
HelloMain appartient-elle à un package particulier ? Parce que l'erreur indique qu'il ne trouve pas la classe ....
Si oui, tu dois l'appeler avec son nom complet (package(s).nomClasse :
java <package>.HelloMain <paramètres>

sfx
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gaëlle
 
au package rmidemo

mais meme en faisant :
D:\RMITEST>java rmidemo.HelloMain 192.168.0.5:1099
Exception in thread "main" java.lang.NoClassDefFoundError: rmidemo/HelloMain


Le truc c'est que j'ai recopié le fichier HelloMain.class dans d:\rmitest.. Parc que toutes mes sources sont dans C:\test dans le package rmidemo..9a marche quand je le fais à partir de C:\test
Mais bon dans ce cas là c'est pas distribué. Moi j'ai beosin d'y accder à distance

Gaëlle
0
silfaxu Messages postés 102 Date d'inscription   Statut Contributeur Dernière intervention   11
 
Que je comprennes bien ton problème ...
Avant tu avais tout (serveur+client) sur la même machine et maintenant tu as un serveur (IP : 192.168.0.5) sur lequel tu fais tourner le serveur RMI
et tu veux qu'une autre machine (distincte du serveur) contacte ce serveur ... c'est ça ?
Tu as copié tes sources du client sur la nouvelle machine cliente, recompilé le tout et executer java rmidemo.HelloMain 192.168.0.5:1099 et tu as l'erreur que tu as décrite dans ton dernier message ...

Une solution est de rendre accessible sur la machine client via le CLASSPATH le bytecode (fichier .class) des fichiers stub du serveur ( solution la + simple mais pas très élégante vu que tu dois avoir accès au serveur ... )
La bonne solution est d'utiliser le mécanisme de chargement dynamique des classes proposé par RMI ... c'est (un peu !!) plus compliqué
Jete un coup d'oeil sur la classe Activatable ...

Si tu n'as pas d'idée, on essaiera de voir ça demain ...

PS: il est important d'executer rmiregistry depuis un répertoire qui ne contient aucune des classes devant être chargée à distance ..

@+

sfx
0
Gaëlle
 
re,

"Avant tu avais tout (serveur+client) sur la même machine et maintenant tu as un serveur (IP : 192.168.0.5) sur lequel tu fais tourner le serveur RMI
et tu veux qu'une autre machine (distincte du serveur) contacte ce serveur ... c'est ça ? "
--> oui

"Tu as copié tes sources du client sur la nouvelle machine cliente, recompilé le tout et executer java rmidemo.HelloMain 192.168.0.5:1099 et tu as l'erreur que tu as décrite dans ton dernier message ... " --> j'ai juste copié HelloMain.java et HelloMain.class que j'ai mis dans un rep crée C:\hello...mais j'ai bien ce msg comme quoi il trouve pas la classe de HelloMain

"Une solution est de rendre accessible sur la machine client via le CLASSPATH le bytecode (fichier .class) des fichiers stub du serveur ( solution la + simple mais pas très élégante vu que tu dois avoir accès au serveur ... ) " --> j'ai fait "C:\hello>java -cp . rmidemo.HelloMain 192.168.0.5 " mais ça change rien... J'ai meme fait "set CLASSPATH=c:\hello/" pour lui dire que c'est dedans qu'il y a HelloMain.java et helloMain.class mais toujours la même erreur.

"PS: il est important d'executer rmiregistry depuis un répertoire qui ne contient aucune des classes devant être chargée à distance .. " --> je l'ai fait

Je bloque complet là !!! ;(

Gaëlle
0
Gaëlle
 
Voilà ce que je viens de trouver sur le net:

If the CLASSPATH environment variable on the server host includes the path of the remote object's stub classes, it will cause rmiregistry to ignore the java.rmi.server.codebase property setting for the server.

rmiregistry must contain the location of the stub files for the remote server object in an HTTP URL-encoded format, so that when this information is sent to the client, the classes can then be downloaded via an HTTP server.

If rmiregistry does not send the location of the stub classes in HTTP-encoded format, the client having no way to download them, will simply throw a ClassNotFoundException.


je pense que ça correspondrait à mon cas.
Est ce que quelqu'un pourrait me dire par étapes simples, ce qu'il faut faire alors?

Gaëlle
0
silfaxu Messages postés 102 Date d'inscription   Statut Contributeur Dernière intervention   11
 
Salut Gaelle,

As-tu bien respecté la même arborescence, identique à celle que tu avais pour le cas ou le client et le serveur sont une même machine, i.e. repertoire rmidemo dans lequel il y a des classes compilées et tes stubs, pour la nouvelle machine distante ... parce que l'erreur que tu as est une erreur de chemin (class rmidemo/HelloMain not found) ...
soit le CLASSPATH est mal positionné, soit l'arborescence ne correspond pas à tes classes compilées ...

sfx (silfaxu@hotmail.com)
0
Gaëlle
 
Salut sfx,

bin oui, sur l'autre pc j'ai créé un rep rmidemo mais j'ai mis que le client dedans (HelloMain)...
pour le classpath je n'en sais rien.. :(
0
silfaxu Messages postés 102 Date d'inscription   Statut Contributeur Dernière intervention   11
 
Pour connaitre ton CLASSPATH, tapes sur la ligne de commande :
(sous Windows) set CLASSPATH
(sous Unix) echo $CLASSPATH$

ça va te donner les différents répertoires que Java va parcourir pour trouver les classes qui lui manquent lors de l'exécution (ou la compilation) d'une appli.

(première solution)Tu dois recopier les classes (compilées) stub du serveur sur le client et ça devrait marcher ...
(seconde solution)Je dois voir tes classes Java parce que c'est un peu plus compliqué et il y a pas mal de modifs à faire :-((

sfx
0
Gaëlle
 
re,

bon pour situer les choses sur mon pc "serveur", toutes les sources sont dans C:\test\rmidemo
Sur l'autre, le "client", HelloMain (.java et .class) est dans C:\hello\rmidemo

J'ai lancé le serveur avec la commande:
java -Djava.security.policy=java.policy -Djava.rmi.server.codebase=file:/192.168.0.5/test/ rmidemo.HelloImpl

(j'ai vu sur le net que
java -Djava.rmi.server.codebase=http://IP/PATH servait donc à indiquer à quelle endroit la machine virtuelle cliente va pouvoir chercher le code du stub et que c'est nécessaire si le client et le serveur ne sont pas sur la même machine... mais bon ils disent que c'est le chargement dynamique du stub mais avec un server web et http...

Ah je viens de recevoir un nouveau message de toi sfx, je fais ce que tu me dis et je te dis ce que ça fait!

(t'es pas connecté sur MSN?)

gaëlle
0
Gaëlle
 
Alors,

quand je fais la cmd SET j'ai une erreur de synthaxe, que je le fasse avec CLASSPATH ou PATH.
Comme quand je fais echo %PATH% ça m'affiche le contenu de la variable PATH, j'ai fait pareil avec CLASSPATH mais ça me retourne "ECHO est actif"...donc bon..

Sinon j'ai recopié HelloImpl_Skel.class et HelloImpl_Stub.class dans C:\hello\rmidemo sur le client mais j'ai toujours la même erreur comme quoi il trouve pas la classe rmidemo/Hello (cette classe est sur le serveur...je peux pas out recopier après ça sera plus distribué!!! quoi que Hello.class c'est l'interface...il la faut peut etre...

Et bé je viens de recopier Hello.class dans C:\hello\rmidemo et ça marche!!! :)

Mais c'est distribué ça?? Ca utilise bien rmi??? Parce que c'est chiant de devoir recopier les classes...Imaginons pour un déploiement sur un parc de 100 machines!! C'est la galère!!!

En tout cas merci beaucoup de ton aode précieuse sfx, franchement je commencais à me décourager!

Gaëlle
0
silfaxu Messages postés 102 Date d'inscription   Statut Contributeur Dernière intervention   11
 
Effectivement la solution de recopier les classes sur la machine cliente n'est pas très élégante ..
La méthode à mettre en oeuvre est le chargement dynamique des classes du côté client (pour qu'il récupère automatiquement les classes provenant du serveur) mais c'est plus compliqué et il faut le prévoir dès le début ...
Si tu veux regarder, jetes un coup d'oeil sur la classe Activatable du package java.rmi.activable, les groupes d'activation et
avec comme tu disais préalablement l'histoire du codeserver, etc ...
Par contre, il n'est pas nécessaire d'avoir un serveur web pour que ça marche :-)) (heureusement d'ailleurs)

Enfin, comme exercice pour démarrer Java, il y a quand même plus simple que RMI ... l'essentiel est que ton projet fonctionne pour la date prévue (demain je crois)

Bonnes Fêtes de Fin d'Année

@+

sfx

PS: je n'ai pas de compte sur MSN ... travaillant sous Unix/Linux ... ;-))
0
Gaëlle
 
Bon maintenant faut que je rédige un truc là-dessus à mettre en annexe de mon rapport...

Comment je peux tourner ça le fait que j'ai recopié des classes sur le client alors qu'avant je dis quil existe le chargement dynamique des stubs?

Gaëlle
0
silfaxu Messages postés 102 Date d'inscription   Statut Contributeur Dernière intervention   11
 
C'est un simple avis ..

Tu peux déja commencer par dire à quoi sert RMI, donner les protocoles impliqués, le principe et enfin le fonctionnement.
Ensuite donner les 6 étapes de création d'une application utilisant RMI en donnant en support ton exemple.
Enfin, tu dis, en approfondissement, qu'il y a d'autres possibilités comme RMI-IIOP, l'activation dynamique des objets avec juste le principe (mais pas de code ou uniquement des bouts de code ... pour donner un exemple)

Et voilà, ça devrait suffir pour ton prof, non ? (ça me rappelle de bons souvenirs ... :-))

sfx
0
Gaëlle
 
Merci,

je vais faire ça...enfin j'ai déjà une partie RMI qui explique tout mais sans aucun code, ça je vais le mettre en annexe avec à la fin un pti truc à propos du chargement dynamique (mise en place plus poussée).
Mais le problème c'est pendant ma démo...je vais leur dire quoi? "Comme vous voyez j'appelle HelloMain du client dont la classe est bein sur lui et je me connecte sur HelloImpl qui est sur l'autre pc dit serveur" C'est bien du RMI ça???? parce que là j'appelle quoi à distance?? rien du tout, non??
(ça me tracasse ..perfectionnsite! ;) )

Gaëlle
0
silfaxu Messages postés 102 Date d'inscription   Statut Contributeur Dernière intervention   11
 
ben si quand même .... tu appelles à partir de ton client une méthode de l'objet distant qui est sur le serveur (dans le serveur de noms rmiregistry ... ) ... c'est quand même du distribué, non ?

Pour bien le montrer, tu peux le faire en deux étapes :
* exécuter le client sans que le serveur soit démarré : tu auras alors une exception te disant que l'objet n'est pas accessible
* puis démarrer le serveur et relancer le client et oh miracle ça marche .. ;-))

C'est pas beau l'informatique ??

sfx

PS: si c'est pas indiscret,c'est pour quoi le rapport (fac, iut, ...) ?
0
Gaëlle
 
re,

ce n'est pas indiscret du tout, ce rapport (enfin ils appelent cela un mémoire technique) c'est pour une école de Chargé de Projet en Info (bac +4) je viens d'avoir mon BTS mais moi j'étais "branchée" Admin Syst et Réseau donc j'ai eu droit à un maginique sujet Dev ; Comparaison entre les objets distribués : Corba, RMI, .NET

Justement je me demandais pour la démo (excellente idée pour les 2 étapes, je vais le faire ça ;) ) quand est ce que je vais la faire...j'ai une heure (30 min français / 30 min anglais) donc déjà je vais la faire pendant le français!! mais je me demandais quand...
voilà mon plan :

Les objets Distribués
Les systemes distribués
Le marché des Obj Distribués
CORBA
RMI
.NET
Comparaison (fonctionnalités générales et coût de déploiement)
Conclusion : Web services, avenir des Obj Dist ?

Donc je sais pas trop où la situer cette démo...tu aurais une idée?

Gaëlle

PS : Mais sous Linux, je crois qu'il y a des prog du genre MSN où tu peux utiliser ton compte passeport ;)
0
silfaxu Messages postés 102 Date d'inscription   Statut Contributeur Dernière intervention   11
 
très bon plan ...
Comme c'est du RMI, je la verrais bien après ta présentation RMI et juste avant celle sur .NET pour illustrer ... ça fait une petite pause 'pratique' entre des exposés assez théoriques et généraux je suppose ..
c'est un simple avis :-))
Les Web Services, c'est une bonne conclusion ...bien que ce soit pas encore super (pbs de sécurité, pas de standard pour l'implémentation SOAP, etc ...)

Un petit conseil : il serait judicieux que tout soit prêt avant ta soutenance pour ne pas perdre de temps lors de celle-ci ... parce que je suppose qu'ils seront + interessés par les aspects théoriques (synthèse + compréhension du sujet) que par l'aspect pratique (surtout pour une formation de Chef de Projet où normalement tu ne développes plus beaucoup ...)

Bonne chance pour ta soutenance ... et dis moi si ça s'est bien passé (ce que je ne doute pas)

Bonne soirée

@+

sfx

PS: je vais voir si je peux trouver quelque chose sous Linux pour MSN .. ;-))
0