2010-08-06 17 views
0

J'ai créé un projet de plugin eclipse et un projet fragment correspondant que j'utilise pour les tests de junit.Comment utiliser les propriétés extraites d'un fichier dans le code d'un projet fragment/plugin eclipse PDE?

Dans le fragment, je spécifie le projet de plug-in comme "plugin hôte". En outre, je précise ce qui suit sur le volet build.properties:

source.. = src/ 
output.. = bin/ 
bin.includes = META-INF/,\ 
       .,\ 
       my.properties 

où my.properties est un fichier situé à la racine du projet fragment. Je l'ai alors écrit un essai où je tente de charger le fichier my.properties comme ceci:

Properties properties = new Properties(); 
InputStream istream = this.getClass().getClassLoader() 
    .getResourceAsStream("my.properties"); 

try { 
    properties.load(istream); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

mais istream est nul et le test échoue avec un NullPointerException lors de l'appel de charge dans le bloc d'essai.

J'ai essayé de faire la même chose dans le plugin hôte et là ça marche bien. Des idées sur pourquoi je ne peux pas lire resouces dans mon fragment PDE lors de l'utilisation de Junit?

+0

@skaffman. Si eclipse-plugin est considéré comme un bon tag, pourquoi les propriétés java devraient-elles être divisées en deux? J'aime aussi la variante two-tags, mais ne devrions-nous pas suivre le système existant? – Gangnus

Répondre

0

Essayez d'utiliser Bundle#getEntry. Si votre plug-in a un Activator, vous obtenez un objet BundleContext lorsque votre plugin est démarré (utilisez Bundle-ActivationPolicy: lazy dans votre manifeste). Vous pouvez obtenir l'objet Bundle de la BundleContext:

public class Activator implements BundleActivator { 
    private static Bundle bundle; 

    public static Bundle getBundle() { 
     return myBundle; 
    } 
    public void start(BundleContext context) throws Exception { 
     bundle = context.getBundle(); 
    } 
} 

... 
URL url = Activator.getBundle().getEntry("my.properties"); 
InputStream stream = url.openStream(); 
properties.load(stream); 
+0

Problème résolu juste nécessaire pour utiliser le lanceur de test junit pour les projets pde au lieu du lanceur de junit régulière. – u123

+0

Code très étrange. getBundle() ne peut pas être remplacé, car il est final dans la classe parent Plugin. D'un autre côté, toutes ces fonctionnalités sont déjà présentes dans Plugin. Mais ce parent getBundle() retourne un paquet nul ... – Gangnus

0

Un problème que vous pourriez avoir est que

InputStream istream = this.getClass().getClassLoader(). 
getResourceAsStream("my.properties"); 

se comporte différemment dans deux situations où « ce » est situé dans un package différent. Puisque vous n'avez pas ajouté "/" au début, java commencera automatiquement à regarder la racine du paquet au lieu de la racine du classpath pour la ressource. Si le code de votre projet de plug-in et votre projet de fragment existent dans des packages différents, vous avez un problème.

0

Andrew Niefer a souligné la direction, mais la solution est erronée. C'est celui qui fonctionne:

1) Ajoutez super(); au constructeur de votre activateur.
2) Mettre cela dans le constructeur de votre plugin:

Properties properties = new Properties(); 

    try { 
     Bundle bundle=Activator.getDefault().getBundle(); 
     URL url = bundle.getEntry("plugin.properties"); 
     InputStream stream; 
     stream = url.openStream(); 
     properties.load(stream); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

Et vous avez fonctionnement "propriétés".


Explications:

Faire (1) vous arriverez à tout ce que la fonctionnalité:

public class Activator implements BundleActivator { 
    private static Bundle bundle; 

    public static Bundle getBundle() { 
     return myBundle; 
    } 
    public void start(BundleContext context) throws Exception { 
     bundle = context.getBundle(); 
    } 
} 

Il est déjà présent dans la classe pré-parent plug-in. Et vous ne pouvez simplement pas le mettre dans Activator, car getBundle() est final dans Plugin.

Remarquez Activator.getDefault() dans (2). Sans ce bundle est inaccessible, il est pas statique. Et si vous créez simplement une nouvelle instance d'activateur, l'ensemble sera null.


Il y a une autre façon de prendre un paquet:

Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID); 

à vérifier que Activator.PLUGIN_ID est réglé sur la chaîne correcte - tout comme dans le champ ID de la page Présentation du plugin. BTW, vous devriez vérifier ce Activator.PLUGIN_ID après chaque changement de l'ID de plugin de toute façon.