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

Java Discussion :

Où placer un jar pour qu'un ServiceLoader.load le trouve


Sujet :

Java

  1. #1
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    909
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 909
    Points : 1 360
    Points
    1 360
    Par défaut Où placer un jar pour qu'un ServiceLoader.load le trouve
    Bonjour,
    Je veux créer un "plugin" pour application java et pouvoir le déployer/distribuer séparément de l'application-mère.
    Quand j'incorpore sa source dans la source de l'application-mère, ça fonctionne. Que je les sépare et mets les 2 jar l'un à côté de l'autre. Cela ne fonctionne pas.

    Voici le code de l'application-mère:
    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
    private static void init() {
        extensions = new LinkedHashMap<String, itFileAnalyser>();
        analysers = new ArrayList<itFileAnalyser>();
        // Load les analyseurs connus
        ServiceLoader<itFileAnalyser> loader = ServiceLoader.load(itFileAnalyser.class);
        logger.debug("Looking for file analysers.");
        for (Iterator<itFileAnalyser> it = loader.iterator(); it.hasNext();) {
            itFileAnalyser analyser;
            try {
                analyser = it.next();
            } catch (Exception e) {
                logger.error("while retrieving an analyser",e);
                continue;
            }
            logger.debug("\tFound " + analyser.getClass().getName());
            areSupportedFilesPlayable = areSupportedFilesPlayable | analyser.areFilesPlayable();
            analysers.add(analyser);
            retrieveExtensions(analyser);
        }
        logger.debug("Got analyser for:");
        if (extensions.isEmpty()) {
            logger.debug("\tnone");
        } else {
            for (String extension : extensions.keySet()) {
                logger.debug("\t" + extension + " -> " + extensions.get(extension).getClass().getName());
            }
        }
    }
    Le jar du plugin est structuré comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    com
       ... 
          mesclasses.class
    META-INF
       maven
          ... 
             pom.properties, pom.xml
       services
          com.zparkingb.zploger.Compute.analyzers.itFileAnalyser
    Avez-vous une idée de ce qu'il faut changer ?

  2. #2
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    909
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 909
    Points : 1 360
    Points
    1 360
    Par défaut
    En ces temps hivernaux très ensoleillés, personne ne presse au portillon pour répondre à ma petite question.
    J'ai donc fini par trouver la solution...

    J'ai donc créé une nouvelle classe URLClassLoader:
    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
        private class URLClassLoaderImpl extends URLClassLoader {
     
            public URLClassLoaderImpl() {
                super(new URL[]{}, FileAnalyserProvider.class.getClassLoader());
            }
     
            @Override
            public void addURL(URL url) {
                super.addURL(url);
            }
     
            public void addPath(Path path) {
                logger.debug("Adding file \"" + path.toString() + "\" to URLClassLoader");
                try {
                    this.addURL(path.toUri().toURL());
                } catch (MalformedURLException e) {
                    logger.error("While adding resourece to URLClassLoader", e);
                }
            }
     
            public void addFolder(Path folder) {
                logger.debug("Adding folder \"" + folder.toString() + "\" to URLClassLoader");
                if (folder != null && Files.exists(folder) && Files.isDirectory(folder)) {
     
                    try (DirectoryStream<Path> stream = Files.newDirectoryStream(folder)) {
                        for (Path file : stream) {
                            addPath(file);
                        }
                    } catch (IOException | DirectoryIteratorException x) {
                        // IOException can never be thrown by the iteration.
                        // In this snippet, it can only be thrown by newDirectoryStream.
                        logger.error("While reading " + folder, x);
                    }
                }
            }
    Je l'ai utilisée pour faire le ServiceLoader.load() tout en ayant au préalable ajouté l'URL vers le jar du plugin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    classLoader = new URLClassLoaderImpl();
            Path plugins = MyApp.getInstance().getApplicationPath("plugins");
            if (plugins != null) {
                logger.debug("\"plugins\" folder found");
                classLoader.addFolder(plugins);
            } else {
                logger.warn("\"plugin\" folder not found");
            }
            // Load les analyseurs trouvés comme services externes
            ServiceLoader<itFileAnalyser> loader = ServiceLoader.load(itFileAnalyser.class, classLoader);
            logger.debug("Looking for file analysers from URLClassLoader.");
            for (itFileAnalyser analyser : loader) {
                addAnalyser(analyser);
            }

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

Discussions similaires

  1. [Java 6] où placer les .jar pour imports?
    Par Jean_Benoit dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 30/01/2009, 10h07
  2. Réponses: 10
    Dernier message: 17/08/2006, 22h27
  3. Réponses: 4
    Dernier message: 18/05/2006, 09h05
  4. Réponses: 8
    Dernier message: 18/04/2006, 12h16
  5. [RCP][plug-ins]Jars pour mes plugins dans un client RCP??
    Par tophebboy dans le forum Eclipse Platform
    Réponses: 5
    Dernier message: 14/03/2006, 16h56

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