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

View more Tutorials:

1- Введение

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

1.1- Suggest

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

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

Модельные примеры включают 3 проекта
  • target-runtime  
  • osgi-define-aspectj
  • affected-osgi
  1. osgi-define-aspectj
    •  является osgi проектом как и aspectj project, который имеет определение aspectj как SumAspectj.aj
  2. 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".
  1. Назвать конфигурированное приложение "Run affected-osgi project"
  2. Выбрать ваших 2 проекта.
  3. Отмените check всех Target Platform
  4. Нажмите кнопку "Add Required Bundles" чтобы Eclipse автоматически рассчитал зависимые bundle.
  5. Нажмите кнопку Apply
Запуск osgi project "affected-osgi" дает результат:
Результаты показали, что aspectj "SumAspectj"  определенные в osgi "osgi-define-aspectj" не влияет на другие osgi. Далее мы будем продолжать конфигурацию чтобы удостовериться  "SumAspectj" что повлияет на "affected-osgi".
Объявить еще bundle ,которые требуются для   "affected-osgi".
  1. org.eclipse.osgi
  2. org.aspectj.weaver
  3. org.eclipse.equinox.weaving.aspectj
  4. org.eclipse.equinox.weaving.caching
  5. 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" и вот результаты, которые вы ожидали.

View more Tutorials: