2009-11-17 6 views
3

Je tente d'utiliser clojure pour mettre en œuvre un « plugin » pour un fournisseur logiciel fourni.problème clojure rmi classpath

est ici un peu de fond sur le fournisseur de logiciel fourni. Il m'attend à mettre en œuvre une interface particulière, puis mettre le fichier jar contenant cette implémentation dans un répertoire sur son serveur. Ensuite, lorsqu'un client utilise le logiciel, ma classe mis en œuvre se « envoyé » au client à partir du serveur via RMI et ma mise en œuvre de l'interface fonctionne sur le client. Le client n'a pas mon fichier jar (ou le fichier clojure jar) dans son classpath. Seul le serveur a ces fichiers jar. RMI semble être assez intelligent pour télécharger quoi que ce soit dépendances sont nécessaires.

J'ai réussi construit en Clojure et il semble fonctionner une mise en œuvre très simple. Le problème est, je voudrais être en mesure de mettre à jour mon implémentation sur le client à la volée. J'ai intégré un repl-server dans ma classe et je peux me connecter avec succès. Juste pour être clair, le repl-server est en cours d'exécution sur le client et je suis en mesure de se connecter à la repl obtenir une invite "clojure.core =>". Cependant, le repl semble être assez paralysé. Si j'entre (+ 1 1) j'obtiens l'erreur suivante: "java.lang.ClassNotFoundException: clojure.lang.Numbers". Si entrez (str "kent") je reçois "java.lang.NoClassDefFoundError: clojure/lang/ AFunction". La plupart des choses que j'entreprends produisent quelque chose de similaire. Je peux cependant faire un def simple tel que (def x 3) et x est défini donc le REPL semble fonctionner dans un certain sens.

Il semble que cela pourrait être un problème de classpath, mais je ne sais pas pourquoi mon « compilé » code, en cours d'exécution sur le client ne serait pas un problème classpath alors que le rempl, en cours d'exécution sur le même client ne peut pas trouver core classes.

Des idées?

Merci. Kent.

Répondre

2

Tout d'abord, serait-il possible de distribuer clojure.jar dans le cadre de votre client RMI? Basé sur votre description du logiciel du vendeur, je suppose que la réponse est non.

Deuxièmement, le contenu de clojure.jar et de votre objet RMI se trouve-t-il dans le même fichier jar sur le serveur ou sont-ils tous deux dans leurs propres fichiers jar?

Il semble très probable que c'est une question de classloader. Dans Clojure, chaque fonction définie génère son propre fichier de classe que Clojure charge ensuite via un chargeur de classe spécifique. IIRC chaque fonction est chargée par sa propre instance de classloader afin de permettre à cette fonction d'être récupérée au cas où elle serait redéfinie. De même, je pense que RMI utilise son propre chargeur de classe pour charger des objets RMI distants sur le réseau. Alors peut-être que les deux chargeurs de classe interagissent mal.

Désolé, je ne peux pas être plus utile ...

- Lauri