Интеграция OSGi и AspectJ
View more Tutorials:
Этот документ основан на:
-
Eclipse 4.7, 4.6 (OXYGEN, NEON)
Убедитесь, что ваш Eclipse установлен Ajdt Plugin, если еще не установлен, вы можете обратиться к следующим документам:
Модельные примеры включают 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, который определяется в проекте выше.

Создайте обычный 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.

Создать проект "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 объявленный в проекте выше
Однако каждый osgi bundle использует свой собственный ClassLoader, поэтому aspectj работает только внутри этого OSGi. Для того, чтобы он работал с другим osgi bundle, требуется некоторые конфигурации. Давайте сделаем другой проект , который находится под влиянием проекта aspectj объявленный в проекте выше
Точно так же вы создаете другой 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" и вот результаты, которые вы ожидали.
