IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Client/Serveur : import des interfaces du serveur dans le jar client.


Sujet :

Langage Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2006
    Messages : 32
    Par défaut Client/Serveur : import des interfaces du serveur dans le jar client.
    Bonjour,

    Voilà, je viens de finaliser un petit client/serveur RMI pour me familiariser avec cette technologie. Tout fonctionne en local mais lors du packaging de mes applications client et serveur m'arrive une question toute métaphysique :

    Comment puis je faire connaitre l'interface métier implémentée sur le serveur par mon client au niveau des imports ?

    Actuellement je travaille sous eclipse et j'ai donc mis une référence au projet Server dans le build path de mon client. Mais je me vois mal mettre en librairie de mon client le jar du serveur uniquement pour cette raison...

    Par ailleurs, je ne sait pas si dupliquer sur le client l'arborescence des packages afin de copier sous le bon nom de package mon interface est une solution digne de ce nom.

    Comment feriez vous ?

    Ps : je me rends bien compte que c'est d'une lisibilité comparable à celle du bilan comptable de fin d'année d'une SSII mais je n'ai pas pu faire mieux sur le moment

    Merci d'avance

    Edit :

    voici quelques sources si jamais ça peut aider. Je prendrais volontiers toutes remarques sur la qualité du code

    Code du client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    package client;
    import java.rmi.*;
    import server.HelloInterface;
    
    public class HelloClient {
    	public static void main(String[] args) {
    		setSecurityManager();
    		try {
    			HelloInterface hello = (HelloInterface)	Naming.lookup("rmi://maMachine:1099/Hello1");
    			System.out.println(hello.sayHello());
    		} catch (Exception e) {
    			System.err.println("Erreur client " + e);
    		}
    	}
    	
    	private static void setSecurityManager(){
    		System.setProperty("java.security.policy", "client.policy");
    		if (System.getSecurityManager() == null)
    		System.setSecurityManager(new RMISecurityManager());
    	}
    }
    Code serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    package server;
    import java.rmi.*;
    import java.rmi.registry.LocateRegistry;
     
    public class HelloServer {
    	public static void main(String[] args) {
    		// TODO vérifier qu'on peut bien parmaetrer le security manager en static
    		//setSecurityManager();
    		try {
    			LocateRegistry.createRegistry(1099);
    			Naming.bind("Hello1",
    					new Hello("Hello world!"));
    			System.out.println("Serveur prêt!");
    		} catch (Exception e) {
    			System.err.println("Erreur serveur " + e);
    		}
    	}
     
    	private static void setSecurityManager(){
    		System.setProperty("java.security.policy", "client.policy");
    		if (System.getSecurityManager() == null)
    		System.setSecurityManager(new RMISecurityManager());
    	}
    }
    Interface métier (localisée dans le jar du serveur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    package server;
    import java.rmi.*;
     
    public interface HelloInterface extends Remote {
     
    	public String sayHello() throws java.rmi.RemoteException;
    }

    Implémentation de cette interface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package server;
    import java.rmi.*;
    import java.rmi.server.*;
     
    public class Hello extends UnicastRemoteObject implements HelloInterface {
     
    	private String message;
     
    	/*constructeur*/
    	public Hello(String s) throws RemoteException{
    		message=s;
    	}
    	public String sayHello() throws RemoteException {
    		return message;
    	}
    }

    Edit 2 : changement de titre car cette problématique peut arriver sur toutes les architectures client serveur.

  2. #2
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Il est bien evident qu'il ne faut pas mettre les jars serveur dans les jars clients et viceversa.

    Il faut séparer les classes communes aux deux et en faire un jar commun. Mais cela fait, de fil en aiguille, un projet à part. J'imagine que c'est ce que tu n'as pas fait ?

    Sinon il y a la classe URLClassLoader qui peut aider en ce cas.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2006
    Messages : 32
    Par défaut
    Merci pour ces différentes pistes.

    Quelle approche préfères tu entre ces deux et pourquoi s'il te plait ?

  4. #4
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Salut,
    Perso, je sépare les classes communes dans un projet séparé (donc jar séparé)
    http://djo-mos.developpez.com/tutori...oting-hessian/
    C'est pas exactement RMI, mais c'est à propos de remoting, et je décris là comment je procède.

  5. #5
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Ahoulà je ne suis sûr de pas grand chose...

    Perso je préfère l'approche 1 : il y a une zone commune entre client et serveur, zone qui fait l'objet d'un projet à part entière. Le problème est que client et serveur sont souvent si interdépendants qu'il est bien difficile de faire l'un sans l'autre, encore plus d'avoir un 3ème projet commun. Bref cette orthodoxie ne fait que compliquer la vie.

    J'arrive à peu près à résoudre ce genre de cas grâce aux merveilles de Maven, qui me permet de jongler entre plusieurs projets sans trop de prise de tête. Le problème est de coordonner Maven avec les EDI (Netbeans pour moi), et avec le déploiement (là j'utilise Ant), mais c'est pas très au point, même s'il y a beaucoup de progrès sur ces questions.

    Je n'aime pas beaucoup l'approche 2 : ces histoires de class loaders spéciaux m'ont toujours paru réservées aux structures qui ont beaucoup de personnels spécialisés qui se plaisent dans la technologie pointue.

    Bref, pour moi, c'est un problème non-résolu

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2006
    Messages : 32
    Par défaut
    Problème résolu !

    Je vais adopter l'approche troisième projet aidé d'Ant. Mais je ne peux m'ôter de l'esprit un sentiment de perplexité . Ceci dit, je ne vois pas comment faire autrement, même Chuck Norris serait obligé de faire pareil

    Merci bien de votre aide.

  7. #7
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par brainstorm Voir le message
    même Chuck Norris serait obligé de faire pareil
    Attention, pas d'hérésie
    Chuck Norris serait capable de faire fonctionner le client/serveur sans code, sans machine et surtout sans électricité.
    Faut pas critiquer Chuck Norris
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 21/12/2007, 08h24
  2. importer des données d'excel dans la base de données
    Par Cifrine dans le forum VBA Access
    Réponses: 2
    Dernier message: 01/06/2007, 14h48
  3. Réponses: 2
    Dernier message: 26/12/2006, 17h03
  4. Importer des données format CSV dans BBD MySQL
    Par Taz_8626 dans le forum Administration
    Réponses: 1
    Dernier message: 04/04/2006, 14h16
  5. Importer des données de Excel dans pages .ASP
    Par sperron dans le forum ASP
    Réponses: 8
    Dernier message: 24/03/2006, 16h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo