codestory

Einbindung von OSGi und AspectJ

  1. Giới thiệu
  2. Das Beispielsmodell
  3. Project target-runtime
  4. Project "osgi-define-aspectj"
  5. Project "affected-osgi"

1. Giới thiệu

Das Dokument basiert auf die Quelle von ...
  • Eclipse 4.7, 4.6 (OXYGEN, NEON)

Stellen Sie sicher, dass Ihre Eclipse das Ajdt Plugin installiert hat, wenn nicht installiert können Sie das folgende Dokument gucken

2. Das Beispielsmodell

Das Beispiel besteht aus 3 Project
  • target-runtime
  • osgi-define-aspectj
  • affected-osgi
  • osgi-define-aspectj
    • ist ein osgi project und auch ein aspectj project, indem gibt es eine Definition von aspectj : SumAspectj.aj
  • affected-osgi
    • ist ein osgi project und kein aspectj project. Es ist abhängig von osgi-define-aspectj, und liegt unter dem Effekt von einem aspectj , das in dem oben Projekt definiert wird

3. Project target-runtime

Erstellen Sie ein normales Java Projekt mit dem Name von "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)
Zum letzten drücken Sie "Set As Target Runtime" damit die Bibliotheke runtime wirken auf allen Projekte in Workspace

4. Project "osgi-define-aspectj"

Erstellen Sie ein Projekt "osgi-define-aspectj":
  • File/New/Other..
  • org.o7planning.tutorial.osgidefineaspectj.Activator
Wandeln Sie dieses Projekt in das aspectj project um
Das Ergebni von der Umwandlung
Wir werden einige Class und ein aspectj erstellen um ein Ergebnis wie folgend erzielen
Zuerst fügen Sie in aspectj SumAspecj ein. Auf die Eclipse wählen Sie
  • 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);

   }

}
Führen Sie die Klasse TestSumInternal durch und jedewenn die Methode "sum" läuft, wird aspectj SumAspectj funktionieren und die Text "Before execution sum" aufschreiben
Zunächste werden wir 'export package' und 'aspectj' anmelden damit die anderen osgi auch benutzen
Deshalb haben wir bisher ein osgi Projekt mit der Teilnahme vom aspectj erstellt und das Projekt läuft gut in diesem osgi.

Allerdings benutzt jede bundle osgi ihre eigene ClassLoader, deshalb hat aspectj nur die interne Wirkung in diesem osgi. Wir brauchen einige Konfiguration um auf die anderen osgi bundle ưinzuwirken. Machen wir weiter ein anderes Projekt damit es ist von im oben Projekt angemeldeten aspectj eingewirkt

5. Project "affected-osgi"

Ähnlich erstellen Sie ein anderes osgi project mit dem Name von "affected-osgi".
Melden Sie an, dass es von osgi "osgi-define-aspectj" abhängig ist. und 2 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;
   }

}
Jetzt konfigurieren wir um osgi "affected-osgi".zu starten
  • Stellen Sie den Name von der Konfiguration zum Applikation-Starten "Run affected-osgi project"
  • Klicken Sie um 2 Ihre Projekte zu wählen.
  • Wählen Sie alle Target Platform ab
  • Klicken Sie auf "Add Required Bundles" damit Eclipse automatisch die abhängigen Bundle kalkuliert.
  • Klicken Sie auf Apply.
Das Ergebnis vom Starten osgi project "affected-osgi" sind
Das oben Ergebnis zeigt, aspectj "SumAspectj", das im osgi "osgi-define-aspectj" definiert wird, hat noch keine Wirkung auf die anderen osgi. Zunächst werden wir weiter konfigurieren um sicherzustellen, dass "SumAspectj" wirkt auf die "affected-osgi".
Melden Sie weiter die Bundle für das osgi "affected-osgi" an
  • org.eclipse.osgi
  • org.aspectj.weaver
  • org.eclipse.equinox.weaving.aspectj
  • org.eclipse.equinox.weaving.caching
  • org.eclipse.equinox.ds
Melden Sie den Parameter des Laufenumfeld an
  • -Dosgi.framework.extensions=org.eclipse.equinox.weaving.hook
  • -Daj.weaving.verbose=true
  • -Dorg.aspectj.weaver.showWeaveInfo=true
  • -Dorg.aspectj.osgi.verbose=true
Melden Sie das ausgeweiterte Fragment für osgi org.eclipse.osgi.an
  • -Dosgi.framework.extensions=org.eclipse.equinox.weaving.hook
Die folgenden Zeile können Sie zum Austesten (Debug) einfügen
  • -Daj.weaving.verbose=true
  • -Dorg.aspectj.weaver.showWeaveInfo=true
  • -Dorg.aspectj.osgi.verbose=true
Stellen Sie sicher, dass bundle: org.eclipse.equinox.weaving.aspectj in Level 2 automatisch startet.
Zum letzten starten Sie wieder osgi "affected-osgi" und das ist das gewünschte Ergebnis