Je rencontre un problème avec un programme RMI activable qui tourne sur
un ordinateur Linux avec le JDK 1.3.1_03. Ce programme est utilisé (VIA
RMI) par un programme Java qui tourne sur un ordinateur Windows XP avec
le JDK 1.3.1_02.
Afin de faciliter la compréhension, quand je parlerai de "programme
distant", je ferais référence au programme RMI activable (qui est sur le
Linux) et quand je parlerai de "programme client", je ferais référence
au programme java qui tourne sur Windows.
Quand je lance le programme distant et que je le laisse tourner (sans le
faire quitter), le programme client arrive a interroger mon programme
distant et récupère la réponse sans aucun problème.
Mais quand je lance le programme distant, qu'il s'enregistre auprès de
RMID et que je le fais quitter afin de tester l'activation de ce
programme. Le programme client ne parvient pas à interroger le programme
distant et reçoit un message d'erreur (en fonction de la sécurité
utilisée pour lancer le programme client) :
*****************
* PREMIER ESSAI *
*****************
Le RMIRegistry et le RMID sont lancés dans 3 sessions différentes sur
l'ordinateur Linux de cette manière :
[bruno@pain bruno]$ rmiregistry
[bruno@pain bruno]$ rmid
[bruno@pain bruno]$ java
-Djava.rmi.server.codebase=http://192.168.102.37:8001/
-Djava.security.policy=/usr/java/jdk1.3.1_03/jre/lib/security/java.policy.all
CurrencyCalculator http://192.168.102.37:8001/
/usr/java/jdk1.3.1_03/jre/lib/security/java.policy.all
Après quelques secondes, le programe distant se termine (puisque je l'ai
mis dans le code afin de tester l'activation RMI), et donc il s'est
enregistré dans le RMID.
Quand je lance le programme client, je reçois ceci :
C:\java\CODES_~2\ConvertMyCurrency>java
-Djava.security.policy=C:\java\jdk1.3.1_02\jre\lib\security\java.policy.all
ConvertMyCurrency rmi://192.168.102.37 10 EUR BEF
You requested to change 10.0 EUR in the BEF currency.
Lookup -> OK
java.rmi.activation.ActivateFailedException: failed to activate object;
nested exception is:
java.security.AccessControlException: access denied
(com.sun.rmi.rmid.ExecOptionPermission
****************
* SECOND ESSAI *
****************
J'ai refait un essai, en utilisant le même fichier de policy sur le
RMID, et donc j'ai tout relancé de cette manière là :
[bruno@pain bruno]$ rmiregistry
[bruno@pain bruno]$ rmid
-J-Djava.security.policy=/usr/java/jdk1.3.1_03/jre/lib/security/java.policy.all
[bruno@pain bruno]$ java
-Djava.rmi.server.codebase=http://192.168.102.37:8001/
-Djava.security.policy=/usr/java/jdk1.3.1_03/jre/lib/security/java.policy.all
CurrencyCalculator http://192.168.102.37:8001/
/usr/java/jdk1.3.1_03/jre/lib/security/java.policy.all
Quand je lance le programme client, je reçois ceci :
C:\java\CODES_~2\ConvertMyCurrency>java
-Djava.security.policy=C:\java\jdk1.3.1_02\jre\lib\security\java.policy.all
ConvertMyCurrency rmi://192.168.102.37 10 EUR BEF
You requested to change 10.0 EUR in the BEF currency.
Lookup -> OK
java.rmi.activation.ActivateFailedException: failed to activate object;
nested exception is:
java.rmi.activation.ActivationException: group creation failed
after 2 tries; nested exception is:
java.rmi.ConnectException: Connection refused to host:
192.168.102.37; nested exception is:
java.net.ConnectException: Connexion refusÚe
*******************
* TROISIEME ESSAI *
*******************
J'ai lu un article sur
http://developer.java.sun.com/developer/products/jini/execpolicy.html au
sujet de la sécurité de RMID qui a changé entre le JDK 1.2 et le JDK 1.3
et j'ai donc essayé de lancer le tout de cette manière là :
[bruno@pain bruno]$ rmiregistry
[bruno@pain bruno]$ rmid -J-Dsun.rmi.activation.execPolicy=none
[bruno@pain bruno]$ java
-Djava.rmi.server.codebase=http://192.168.102.37:8001/
-Djava.security.policy=/usr/java/jdk1.3.1_03/jre/lib/security/java.policy.all
CurrencyCalculator http://192.168.102.37:8001/
/usr/java/jdk1.3.1_03/jre/lib/security/java.policy.all
Quand je lance le programme client, je reçois toujours la même erreur
que la 2e tentative :
C:\java\CODES_~2\ConvertMyCurrency>java
-Djava.security.policy=C:\java\jdk1.3.1_02\jre\lib\security\java.policy.all
ConvertMyCurrency rmi://192.168.102.37 10 EUR BEF
You requested to change 10.0 EUR in the BEF currency.
Lookup -> OK
java.rmi.activation.ActivateFailedException: failed to activate object;
nested exception is:
java.rmi.activation.ActivationException: group creation failed
after 2 tries; nested exception is:
java.rmi.ConnectException: Connection refused to host:
192.168.102.37; nested exception is:
java.net.ConnectException: Connexion refusÚe
***************************************
* OU EST (SONT) MON (MES) ERREUR(S) ? *
***************************************
Je précise que :
- entre chaque essai, j'ai bien pris soin de supprimer le répértoire
"log" généré par RMID.
- je travaille avec RMI 1.2, ca veut dire que j'ai seulement une classe
STUB et AUCUNE de classe SKELETON.
Le fichier de policy utilisé est celui-ci :
// Standard extensions get all permissions by default
grant {
permission java.security.AllPermission "", "";
};
Je pense que le problème est que RMID ne parviens pas à activer mon
programme distant, mais je ne comprends pas POURQUOI !
Vu que le message est déjà très long, j'ai placé tout les codes sources
sur http://www.baguette.net/rmi-activation/ où vous pouvez voir le code
de mes programmes client et distant, si nécessaire.
S'il vous plait (je suis à genoux, là), pouvez m'expliquer mon (mes)
erreur(s) ? Que dois-je changer ?
Je suis complètemement bloqué sur ce problème depuis plusieurs jours
(bientôt une semaine). :-(
D'avance un tout grand merci pour votre aide et vos explications !
--
----------------------------------------
Bruno Baguette - bou...@alussinan.org