betacode

Интеграция OSGi и AspectJ

  1. Введение
  2. Модельные примеры
  3. Project target-runtime
  4. Project "osgi-define-aspectj"
  5. Project "affected-osgi"

1. Введение

Этот документ основан на:
  • Eclipse 4.7, 4.6 (OXYGEN, NEON)

Убедитесь, что ваш Eclipse установлен Ajdt Plugin, если еще не установлен, вы можете обратиться к следующим документам:

2. Модельные примеры

Модельные примеры включают 3 проекта
  • target-runtime
  • osgi-define-aspectj
  • affected-osgi
  • osgi-define-aspectj
    • является osgi проектом как и aspectj project, который имеет определение aspectj как SumAspectj.aj
  • affected-osgi
    • является osgi проектом и не является aspectj project. Зависит от osgi-define-aspectj, и под влиянием aspectj, который определяется в проекте выше.

3. Project target-runtime

Создайте обычный Java проект, с названием "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)
В конце нажмите кнопку "Set AsTarget Runtime" чтобы библиотеки runtime повлияли на все проекты в Workspace.

4. Project "osgi-define-aspectj"

Создать проект "osgi-define-aspectj"
  • File/New/Other..
  • org.o7planning.tutorial.osgidefineaspectj.Activator
Конвертировать этот проект в проект aspectj
Результаты конвертации:
Мы создадим класс и aspectj, чтобы получить результат, как показано ниже:
Для начала добавим aspectj SumAspecj, в Eclipse выбрать:
  • 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);

   }

}
Запустить class TestSumInternal, по результатам можно увидеть, каждый раз при запуске метода с названием "sum", aspectj SumAspectj будет работать и записывает текст "Before execution sum"
Далее мы объявляем "export package" и "aspectj", чтобы другие osgi могли использовать.
Поэтому до данного момента мы создали osgi проект с участием aspectj. И они успешно работают внутри этого OSGi.

Однако каждый osgi bundle использует свой собственный ClassLoader, поэтому aspectj работает только внутри этого OSGi. Для того, чтобы он работал с другим osgi bundle, требуется некоторые конфигурации. Давайте сделаем другой проект , который находится под влиянием проекта aspectj объявленный в проекте выше

5. Project "affected-osgi"

Точно так же вы создаете другой OSGi проект под названием "affected-OSGi".
Объявите, что он зависит от OSGi "OSGi-define-aspectj". И два 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;
   }

}
Теперь мы конфигурируем для запуска OSGi "affected-OSGi".
  • Назвать конфигурированное приложение "Run affected-osgi project"
  • Выбрать ваших 2 проекта.
  • Отмените check всех Target Platform
  • Нажмите кнопку "Add Required Bundles" чтобы Eclipse автоматически рассчитал зависимые bundle.
  • Нажмите кнопку Apply
Запуск osgi project "affected-osgi" дает результат:
Результаты показали, что aspectj "SumAspectj" определенные в osgi "osgi-define-aspectj" не влияет на другие osgi. Далее мы будем продолжать конфигурацию чтобы удостовериться "SumAspectj" что повлияет на "affected-osgi".
Объявить еще bundle ,которые требуются для "affected-osgi".
  • org.eclipse.osgi
  • org.aspectj.weaver
  • org.eclipse.equinox.weaving.aspectj
  • org.eclipse.equinox.weaving.caching
  • org.eclipse.equinox.ds
Объявление параметров среды выполнения:
  • -Dosgi.framework.extensions=org.eclipse.equinox.weaving.hook
  • -Daj.weaving.verbose=true
  • -Dorg.aspectj.weaver.showWeaveInfo=true
  • -Dorg.aspectj.osgi.verbose=true
Объявите фрагменты (fragment) для расширения osgi org.eclipse.osgi.
  • -Dosgi.framework.extensions=org.eclipse.equinox.weaving.hook
Следующие строки можно также добавить для отладки (Debug):
  • -Daj.weaving.verbose=true
  • -Dorg.aspectj.weaver.showWeaveInfo=true
  • -Dorg.aspectj.osgi.verbose=true
Убедитесь в том, что bundle: org.eclipse.equinox.weaving.aspectj автоматически запускается на уровне 2.
В конце перезапустите osgi "affected-osgi" и вот результаты, которые вы ожидали.