devstory

Intégration OSGi et AspectJ

  1. Introduction
  2. Modèle de l'exemple
  3. Project target-runtime
  4. Project "osgi-define-aspectj"
  5. Project "affected-osgi"

1. Introduction

Ce document a été rédigé sur la base de :

  • Eclipse 4.7, 4.6 (OXYGEN, NEON)

Assurez-vous que votre Eclipe a été installé Ajdt Plugin, si vous ne l'avez pas installé, vous pouvez consulter les documents suivants:

2. Modèle de l'exemple

Ces modèles d'exemple comprennent trois projets :

  • target-runtime
  • osgi-define-aspectj
  • affected-osgi
  • osgi-define-aspectj
    • C'est un osgi project ainsi que aspectj project. Ceci est également la définition deaspectj SumAspectj.aj
  • affected-osgi
    • C'est un osgi project mais ce n'est pas aspectj project. Il dépend de osgi-define-aspectj, et prennent effet par aspectj qui est définis ci-dessus.

3. Project target-runtime

Créer un projet java, avec le nom "target-runtime" :
  • File/New/Other
Copy:
  • http://download.eclipse.org/tools/ajdt/47/dev/update/ (Eclipse 4.7 OXYGEN)
  • http://download.eclipse.org/tools/ajdt/46/dev/update/ (Eclipse 4.6 NEON)
Enfin, cliquez sur "Set As Target Runtime" pour que des bibliothèques runtime prennent effet aux tous les projets sur Workspace.

4. Project "osgi-define-aspectj"

Créez le project "osgi-define-aspectj" :
  • File/New/Other..
  • org.o7planning.tutorial.osgidefineaspectj.Activator
Convertissez ce projet en aspectj projet :
Le résultat de la convertissement :


Nous allons créer certaines classes et un aspectj pour obtenir un résultat tel qu'illustration ci-dessous :

Tout d'abord, ajoutez l'aspectj "SumAspecj" et sur Eclipse cliquez :

  • File/New/Others...
  • Package: org.o7planning.tutorial.osgidefineaspectj
  • Name: SumAspectj
SumAspectj.aj
package org.o7planning.tutorial.osgidefineaspectj;

public aspect SumAspectj {
 
  before() : execution(* *.sum(..)) {
      System.out.println("Before execution sum");
  }
 
}
MathUtils.java
package org.o7planning.tutorial.osgidefineaspectj;

public class MathUtils {
   
   public static int sum(int a, int b) {
       return a + b;
   }
}
TestSumInternal.java
package org.o7planning.tutorial.osgidefineaspectj;

public class TestSumInternal {
   
   public static void main(String[] args) {
       
       int value= MathUtils.sum(10,20);
       System.out.println("Value ="+value);

   }

}
Exécutez la classe TestSumInternal et les résultats montrent que lorsque la méthode nommée "sum" a été exécuté, aspectj SumAspectj fonctionnera et il enregistre des lignes de texte "Before execution sum".
Puis, nous déclarons 'export package' et 'aspectj' pourque les autres osgi puissent utiliser.
Donc, jusqu'à présent, nous avons créé est un projet osgi avec la participation de aspectj. Et nous avons exécuté avec succès à l'intérieur de l'osgi.

Cependant chaque bundle osgi utilise sa propre ClasssLoader, donc aspectj fonctionne uniquement en intérieur de ce osgi. Afin de prendre effet sur des autres osgi bundle, il est nécessaire d'avoir une certaine configuration. Travaillez sur un autre projet qui sera affecté par aspectj déclaré sur le projet comme au-dessus.

5. Project "affected-osgi"

De même manière, vous pouvez créer un autre projet osgi à avec le nom de "affected-osgi" .
Sa déclaration dépend de osgi "osgi-définir-aspectj". Et deux bundle:
  • org.eclipse.equinox.console
  • org.apache.felix.gogo.shell
Math2Utils.java
package org.o7planning.tutorial.affectedosgi;

public class Math2Utils {
   
   
   public static float sum(float a,float b)  {
       return a+b;
   }
   
   public static int sum(int a, int b)  {
       return a+b;
   }  
   
}
Activator.java
package org.o7planning.tutorial.affectedosgi;

import org.o7planning.tutorial.osgidefineaspectj.MathUtils;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator {

   private static BundleContext context;

   static BundleContext getContext() {
       return context;
   }

   public void start(BundleContext bundleContext) throws Exception {
       Activator.context = bundleContext;

       this.testSumAspectj();
   }

   private void testSumAspectj() {
       System.out.println("-----------------------");
       int value1 = MathUtils.sum(100, 100);
       System.out.println("Value =" + value1);

       System.out.println("-----------------------");
       int value2 = Math2Utils.sum(100, 100);
       System.out.println("Value =" + value2);

       System.out.println("-----------------------");
       float value3 = Math2Utils.sum(100f, 100f);
       System.out.println("Value =" + value3);
   }

   public void stop(BundleContext bundleContext) throws Exception {
       Activator.context = null;
   }

}
Maintenant, nous allons configurer pour exécuter osgi "affected-osgi".
  • Nomerl'application configurée est "Run affected-osgi project".
  • Cocher vos deux projets.
  • Décocher toutes les vérifications de Target Platform
  • Cliquer sur "Add Required Bundles" pour Eclipse calcule automatiquement des bundles dépendants.
  • Cliquer sur Apply
Les résultats obtenus lors d'exécution du projet osgi "affected-osgi" :
Les résultats ont montré que aspectj "SumAspectj » défini dans le "osgi-défine-aspectj" n'influence pas encore d'autre osgi. Ensuite, nous allons continuer à exécuter pour s'assurer que "SumAspectj" affectera à "affected-osgi".
Déclarez plus de bundles qui demandent à osgi"affected-osgi".
  • org.eclipse.osgi
  • org.aspectj.weaver
  • org.eclipse.equinox.weaving.aspectj
  • org.eclipse.equinox.weaving.caching
  • org.eclipse.equinox.ds
Déclarez de paramètre d'environnement en cours d'exécution :
  • -Dosgi.framework.extensions=org.eclipse.equinox.weaving.hook
  • -Daj.weaving.verbose=true
  • -Dorg.aspectj.weaver.showWeaveInfo=true
  • -Dorg.aspectj.osgi.verbose=true
Déclarez des morceaux (fragments) pour étendre osgiorg.eclipse.osgi.
  • -Dosgi.framework.extensions=org.eclipse.equinox.weaving.hook
Vous pouvez également ajouter les lignes suivantes pour chercher des fautes (Debug) :
  • -Daj.weaving.verbose=true
  • -Dorg.aspectj.weaver.showWeaveInfo=true
  • -Dorg.aspectj.osgi.verbose=true
Assurez-vous que bundle : org.eclipse.equinox.weaving.aspectj a é té automatiquement start à Level 2.
Enfin, vous exécutez osgi "affected-osgi" et voici les résultats que vous attendez.