Интеграция OSGi и AspectJ
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 объявленный в проекте выше
Однако каждый 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" и вот результаты, которые вы ожидали.

Руководства Maven
- Установите Maven для Eclipse
- Руководство Maven для начинающих
- Maven управляет зависимостями
- Построить Multiple Module Project с Maven
- Запускать веб-приложение Java Maven в Tomcat Maven Plugin
- Запуск веб-приложения Java Maven в Jetty Maven Plugin
- Установите Tycho для Eclipse
- Создайте проект Java OSGi с Maven и Tycho
- Создайте пустой проект Maven Web App в Eclipse
- Интеграция OSGi и AspectJ
Show More