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

OGSi Java Discussion :

[OSGi] Service dynamique simple


Sujet :

OGSi Java

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 151
    Points : 133
    Points
    133
    Par défaut [OSGi] Service dynamique simple
    Bonjour à tous,
    j'aimerais faire fonctionner deux composants dynamiques simples avec OSGi, dans mon avec la plateforme Apache Felix, afin de comprendre le fonctionnement de base. Je veux arriver à récupérer un objet (service) de type String (le plus simple je crois) dynamiquement.

    J'ai travaillé à partir de deux tutoriels, un de EclipseZone et l'autre de l'e-book "OSGi in practice" mais je n'arrives pas.

    Ci-dessous, mes premiers pas de bébé OSGi.
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    /**
    * Text Provider
    */
     
    import org.osgi.framework.BundleActivator;
    import org.osgi.framework.BundleContext;
    import org.osgi.framework.ServiceRegistration;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
     
     
    public class Activator implements BundleActivator {
     
    	public void start(BundleContext context) throws Exception {
     
    	//Création du service fourni
    	String texte = "Texte envoyé par le premier composant";
     
     
    	//Enregistrement du service
    	/**
            * @param String.class.getName() Nom de l'interface
            * @param img L'objet du service
            * @param null Propriétés du service
            */
    	context.registerService(String.class.getName(), texte, null);
    	}
    	public void stop(BundleContext context) throws Exception {
    		System.out.println("Arrêt du composant imgprovider_1");
             //Désenregistrer le service
    	}
    }
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    /**
    * Text Consumer
    */
     
    import org.osgi.framework.*;
    import org.osgi.framework.BundleActivator;
    import org.osgi.framework.BundleContext;
    import org.osgi.framework.ServiceRegistration;
    import org.osgi.framework.ServiceReference;
    import org.osgi.util.tracker.ServiceTracker;
    import org.osgi.util.tracker.ServiceTrackerCustomizer;
     
     
    public class Activator implements BundleActivator {
    	private BundleContext context;
    	private ServiceTracker tracker=null;
     
    	//Tracker pour récupéré l'objet
    	private ServiceTracker imgTracker;
    	private String texte;
     
    	public void start(BundleContext context) throws Exception {
    	this.context=context;
     
    	tracker = new ServiceTracker(context, String.class.getName(), new SCustomizer(context));
     
    	tracker.open();
     
    	texte = tracker.getService().toString();
     
    		if(null!=texte)
    	System.out.println(texte);
    	else
    	System.out.println("bbb");
     
    	texte = (String) ServiceFactory.getService(this , tracker.getService());
     
    	}
    	public void stop(BundleContext context) throws Exception {
    		tracker.close();
    	}
     
    	private class SCustomizer extends ServiceTracker{
    		private int finderCount=0;
    		private ServiceRegistration registration=null;
    		private boolean registering = false; 
     
    		public SCustomizer(BundleContext context){
    			super(context, String.class.getName(), null);
    		}
     
    		public Object addingService(ServiceReference sref){
     
    			String texte = (String) context.getService(sref);
     
    			synchronized(this) { 
    				finderCount ++; 
    				if (registering) 
    					return texte; 
    				registering = (finderCount == 1); 
    				if (!registering) 
    					return texte; 
    			} 
     
     
     
    			ServiceRegistration reg = context.registerService(String.class.getName(), texte, null);
     
    			synchronized(this) {
    				registering = false;
    				registration = reg;
    			} 
     
    			return registration;
    		}
     
    		public void modifiedService(ServiceReference sref, Object service){}
     
    		public void removedService(ServiceReference sref, Object service){
    			ServiceRegistration registration = (ServiceRegistration) service;
     
    			registration.unregister();
    			context.ungetService(sref);
    		}
    	}
    }
    Je vous remercie par avance.
    Willy
    Tout vient à point qui sait programmer.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,
    Quel est ton problème exactement ? On peut voir les manifest de tes deux bundles ?
    Tschau

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 151
    Points : 133
    Points
    133
    Par défaut
    Mon problème est que je n'arrive pas à récupérer un objet associé à un service.Voici les Manifest associées aux bundles.
    J'ai essayé de récupérer l'objet avec la méthode getService() mais j'ai une exception qui est levée.

    Celui de textconsumer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Manifest-Version: 1.0
    Bundle-ManifestVersion: 2
    Bundle-Name: Text Consumer
    Bundle-SymbolicName: textconsumer
    Bundle-Version: 1
    Bundle-Activator: Activator
    Bundle-ActivationPolicy: lazy
    Bundle-RequiredExecutionEnvironment: JavaSE-1.6
    Import-Package: org.osgi.framework, org.osgi.util.tracker,
    javax.sql, javax.swing,  org.w3c.dom, javax.xml.transform,
    javax.xml.transform.dom, javax.xml.transform.stream,
    javax.swing.filechooser, org.xml.sax
    Celui de textprovider
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Manifest-Version: 1.0
    Bundle-ManifestVersion: 2
    Bundle-Name: Text Provider
    Bundle-SymbolicName: textprovider
    Bundle-Version: 1
    Bundle-Activator: Activator
    Bundle-ActivationPolicy: lazy
    Bundle-RequiredExecutionEnvironment: JavaSE-1.6
    Import-Package: org.osgi.framework, org.osgi.util.tracker,
    javax.swing,  org.w3c.dom, javax.xml.transform, javax.xml.transform.dom,
    javax.xml.transform.stream, javax.swing.filechooser, org.xml.sax
    Tout vient à point qui sait programmer.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Hum quelle est l'exception ? Est-ce que le text provider est déjà bien enregistré quand le consumer demande le service ?

  5. #5
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 151
    Points : 133
    Points
    133
    Par défaut
    Je m'en doutais que tu allais me posais la question sur le nom de l'exception générée. Je ne l'ai pas sous la main là, mais un peu plus tard oui. Pour donner une idée, ça ressemble à ServiceRegistrationImpl...

    Je veux faire en sorte que le textprovider se lance quand il veut, et que le textconsumer attende qu'il soit disponible. C'est ce que j'entends par service dynamique.
    Tout vient à point qui sait programmer.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Si dans le manifest du text consumer tu mets un Require-Bundle avec le text provider dedans, alors tu seras sur que le consumer ne sera chargé que si le provider a pu être résolu.

  7. #7
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 151
    Points : 133
    Points
    133
    Par défaut
    Je suis d'accord. Est-ce que ça veut dire que je peux écrire des bundles statiques et ensuite la plate-forme s'occupe de changer l'état du textconsumer quand le textprovider est disponible ?
    Tout vient à point qui sait programmer.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Pour que la plateforme charge un nouveau Bundle il faut que celui qui le demande ait les droits suffisants pour le faire.
    Quand le framework charge un nouveau Bundle, il résoud toutes ses dépendances. Si une de ses dépendances ne peut pas l'être, le Bundle n'est pas chargé, ce qui peut bien se comprendre
    Comment veux tu faire pour qu'un service s'enregistre seul ? Il faut bien dire qu framework : charge moi ce Bundle là, et ca seul un service ayant les droits dans le framework peut le faire (si je ne m'abuse). Je ne suis pas sûr de bien comprendre ta demande en fait

  9. #9
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 151
    Points : 133
    Points
    133
    Par défaut
    J'ai tous les droits sur ma plate-forme Apache Felix.
    La gestion des dépendances n'est pas un problème pour moi car j'ai réalisé un programme permettant d'installer les bundles dans l'ordre de résolution des dépendances.
    Le problème est qu'avec des bundles statiques, le premier bundle, fournissant un service s'installe, mais ne propose pas directement le service. Puis le deuxième bundle, demandant le service, s'installe lui aussi. PROBLEME !!! Le service n'est pas disponible ! Une erreur se produit et ce deuxième bundle génère une exception de type NullPointerException.
    L'idée que j'ai eu était de créer des bundles dynamiques, attendant qu'un service soit disponible pour s'y abonner. Ici, le textconsumer attendrait le service du textprovider tant qu'il n'est pas disponible et, quand il est disponible il l'utiliserait.
    Tout vient à point qui sait programmer.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Je ne vois pas la notion statique/dynamique dans ce que tu dis...
    As tu essayé avec un ServiceListener dans le consumer ?
    Ensuite si le service n'est pas publié de suite c'est que ton Bundle ne le publie pas dans l'Activator, ce qui pourtant semble être fait.
    Je vais tester chez moi et je te dis quoi

  11. #11
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 151
    Points : 133
    Points
    133
    Par défaut
    Statique veut dire pour moi que l'abonnement à un service est effectué une seule fois dans le code et si il y a erreur il n'y a aucune réaction prévue.
    L'aspect dynamique voudrait dire qu'a l'exécution une réaction, appropriée à la non-présence du service demandé définit par un système de tracker, serait prévue.
    J'ai essayé avec un ServiceListener, et ça correspond à un service en statique à ce que j'ai compris.
    Tout vient à point qui sait programmer.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Ben je sais pas je pensais à ton consumer qui serait un service listener et quand il détecte que le service qu'il veut vient d'être publié, alors il le prend.
    Sinon une question : tu as bien démarré (avec la commande start) le provider ? J'ai fait chez moi tout ca et quand le provider est démarré et que je démarre le consumer j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    -> start 6
    org.apache.felix.framework.ServiceRegistrationImpl@1ee3914
    Par contre cette ligne je l'ai changée car elle ne se compile pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    texte = (String) ServiceFactory.getService(this,tracker.getService());
    la nouvelle méthode start est :
    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
     
    public void start(BundleContext context) throws Exception {
            this.context = context;
     
            tracker = new ServiceTracker(context, String.class.getName(),
                    new SCustomizer(context));
     
            tracker.open();
     
            texte = tracker.getService().toString();
     
            if (null != texte)
                System.out.println("1>>>>" + texte);
            else
                System.out.println("1bbb");
     
            texte = (String) context.getService(context
                    .getServiceReference(String.class.getName()));
     
            if (null != texte)
                System.out.println("2>>>>" + texte);
            else
                System.out.println("2bbb");
    }
    et là j'obtiens bien ce que tu veux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    start 7
    1>>>>org.apache.felix.framework.ServiceRegistrationImpl@f0eed6
    2>>>>Texte envoyé par le premier composant

  13. #13
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 151
    Points : 133
    Points
    133
    Par défaut
    Je vais tester avec ta modification(après dîner, dans environ 20 minutes).
    Je ne lance pas manuellement les bundles, c'est automatisé. À voir si ça marche. Si oui, ça me serait d'une grande aide. Si je peux le faire avec deux composants, je pourrais le faire avec n.
    Tout vient à point qui sait programmer.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bon là le truc de ce que j'ai vu c'est que le tracker sert pas dans ce que je te propose.
    Une autre question : comment as-tu pu compiler alors que ServiceTracker est une interface et que tu appelles dessus une méthode statiques ?

  15. #15
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 151
    Points : 133
    Points
    133
    Par défaut
    La compilation ne me pose pas de problème chez moi.
    Si le service tracker n'est pas utilisé, je pense que ça ne va pas marcher.
    Je teste tout de suite quand même.
    Tout vient à point qui sait programmer.

  16. #16
    Invité
    Invité(e)
    Par défaut
    Au temps pour moi je voulais dire ServiceFactory

  17. #17
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 151
    Points : 133
    Points
    133
    Par défaut
    Cela me dit quelque chose ServiceFactory. Mais je n'ai pas réussi à l'utiliser.
    Tu avais raison, la compilation n'est pas passé pour moi non plus, j'avais du faire une modification sans recompiler.
    Tout vient à point qui sait programmer.

  18. #18
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 151
    Points : 133
    Points
    133
    Par défaut
    Les bundles compilent. Ils s'installent mais je dois avoir un bug au niveau de mon application parce que le démarrage des bundles ne s'effectue pas. Je ne comprends pas là. Avant ça marchait (la célèbre phrase).

    Génial !!!!! Cela fonctionne donc !! Les composants s'installent bien. Je vais continuer à déboguer. Merci beaucoup George7. Tu habites dans une ville magnifique George7, ça doit être très plaisant. Je te remercie grandement George, tu as débloqué la situation.

    Tous fonctionne bien !!!!!!!!!!!!
    HIIIIIIIIIIIIIIIIIII HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

    Encore MERRRRCI!!!! Cela fait 2 semaines que je bloquais sur ça. Tu es un bienfaiteur George, je ne dis pas que pour moi, mais aussi pour tous les autres que tu as aidé.

    Passe une excellente soirée.
    Tout vient à point qui sait programmer.

  19. #19
    Invité
    Invité(e)
    Par défaut
    Ben ca fait paisir merci
    C'était quoi alors le problème ?
    Quelle est ta solution ?

    EDIT : je suis curieux car ca marche bien si je mets pas le ServiceTrackerCustomizer mais avec ca cast plus... N'ayant pas grande expérience avec les tracker je comprends pas trop

  20. #20
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 151
    Points : 133
    Points
    133
    Par défaut
    Le problème que j'avais pour l'exécution des bundles était un problème de nom symbolique dans le Manifest, c'est tout.

    En résumé

    Le problème était que je n'arrivais pas à m'abonner à un service n'étant pas forcément présent au moment de l'installation.

    La solution est le code que j'avais proposé plus l'appel suivant que tu as proposé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (String) context.getService(context.getServiceReference(String.class.getName()));
    Voici le code final modifié fonctionnant :
    Le fournisseur de service :
    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
    26
    27
    28
    29
    30
    /**
    * Text Provider
    */
    import org.osgi.framework.BundleActivator;
    import org.osgi.framework.BundleContext;
    import org.osgi.framework.ServiceRegistration;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
     
    public class Activator implements BundleActivator {
    	public void start(BundleContext context) throws Exception {
     
    	//Création du service fourni
    	String texte = "Texte envoyé par le premier composant";
     
    	//Enregistrement du service
    	/**
            * @param String.class.getName() Nom de l'interface
            * @param img L'objet du service
            * @param null Propriétés du service
            */
    	context.registerService(String.class.getName(), texte, null);
    	}
    	public void stop(BundleContext context) throws Exception {
    		System.out.println("Arrêt du composant imgprovider_1");
             //Désenregistrer le service
    	}
    }
    Le manifest associé au service ci-dessus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Manifest-Version: 1.0
    Bundle-ManifestVersion: 2
    Bundle-Name: Text Provider
    Bundle-SymbolicName: textprovider
    Bundle-Version: 1.0.0
    Bundle-Activator: Activator
    Bundle-ActivationPolicy: lazy
    Bundle-RequiredExecutionEnvironment: JavaSE-1.6
    Import-Package: org.osgi.framework, org.osgi.util.tracker,
    javax.swing,  org.w3c.dom, javax.xml.transform, javax.xml.transform.dom,
    javax.xml.transform.stream, javax.swing.filechooser, org.xml.sax

    Le demandeur de service :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    /**
    * Text Consumer
    */
     
    import org.osgi.framework.*;
    import org.osgi.framework.BundleActivator;
    import org.osgi.framework.BundleContext;
    import org.osgi.framework.ServiceRegistration;
    import org.osgi.framework.ServiceReference;
    import org.osgi.util.tracker.ServiceTracker;
    import org.osgi.util.tracker.ServiceTrackerCustomizer;
     
    public class Activator implements BundleActivator {
    	private BundleContext context;
    	private ServiceTracker tracker=null;
     
    	//Tracker pour récupéré l'objet
    	private ServiceTracker textTracker;
    	private String texte;
     
    	public void start(BundleContext context) throws Exception {
            this.context = context;
     
            tracker = new ServiceTracker(context, String.class.getName(),
                    new SCustomizer(context));
     
    		//Ouverture du tracker pour récupérer le service
            tracker.open();
     
    		//Récupération du service
            texte = (String) context.getService(context.getServiceReference(String.class.getName()));
    }
     
    	public void stop(BundleContext context) throws Exception {
    		tracker.close();
    	}
     
    	private class SCustomizer extends ServiceTracker{
    		private int finderCount=0;
    		private ServiceRegistration registration=null;
    		private boolean registering = false; 
     
    		public SCustomizer(BundleContext context){
    			super(context, String.class.getName(), null);
    		}
     
    		public Object addingService(ServiceReference sref){
     
    			String texte = (String) context.getService(sref);
    			//Recherche des services
    			synchronized(this) { 
    				finderCount ++; 
    				if (registering) 
    					return texte; 
    				registering = (finderCount == 1); 
    				if (!registering) 
    					return texte; 
    			} 
     
    			ServiceRegistration reg = context.registerService(String.class.getName(), texte, null);
     
    			synchronized(this) {
    				registering = false;
    				registration = reg;
    			} 
     
    			return registration;
    		}
     
    		public void modifiedService(ServiceReference sref, Object service){}
     
    		public void removedService(ServiceReference sref, Object service){
    			ServiceRegistration registration = (ServiceRegistration) service;
     
    			registration.unregister();
    			context.ungetService(sref);
    		}
    	}
    }
    Le manifest associé au service ci-dessus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Manifest-Version: 1.0
    Bundle-ManifestVersion: 2
    Bundle-Name: Text Consumer
    Bundle-SymbolicName: textconsumer
    Bundle-Version: 1.0.0
    Bundle-Activator: Activator
    Bundle-ActivationPolicy: lazy
    Bundle-RequiredExecutionEnvironment: JavaSE-1.6
    Import-Package: org.osgi.framework, org.osgi.util.tracker,
    javax.sql, javax.swing,  org.w3c.dom, javax.xml.transform,
    javax.xml.transform.dom, javax.xml.transform.stream,
    javax.swing.filechooser, org.xml.sax
    EDIT : moi non plus je ne comprends pas trop, OSGi m'échappe encore. Il y a deux version avec les trackers, extends ServiceTracker et implements ServiceTrackerCustomizer.
    Le ServiceTrackerCustomizer, à ce que j'ai compris, est fait pour personnaliser des services (les propriétés de celui-ci).
    Tout vient à point qui sait programmer.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Implémentation d'un service REST simple en Java
    Par 84mickael dans le forum REST
    Réponses: 5
    Dernier message: 31/10/2010, 10h40
  2. Création Tableau dynamique simple
    Par iori11 dans le forum Langage
    Réponses: 1
    Dernier message: 18/09/2008, 21h11
  3. Exemple pl/sql dynamique simple
    Par nunurs83 dans le forum PL/SQL
    Réponses: 7
    Dernier message: 25/08/2008, 17h54
  4. Réponses: 7
    Dernier message: 07/11/2007, 10h20
  5. Carte dynamique simple : choix language
    Par forest82 dans le forum Général Conception Web
    Réponses: 6
    Dernier message: 19/09/2005, 12h12

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