AspectJ: как получить pointcuts для консультирования классов, расположенных в других проектах

Это должно быть просто.

вопрос
Как получить pointcut в одном проекте, чтобы посоветовать код / классы в другом проекте?


контекст
Я работаю в Eclipse с двумя проектами. Для простоты объяснения назовем одно научный проект и другие проект по математике и сказать, что научный проект опирается на математический проект, и я разрабатываю в обоих проектах одновременно. Проект math является основным продуктом в производстве, и жизнь будет проще, если я не буду сильно изменять код.

В настоящее время я отлаживаю взаимодействие между этими двумя проектами. Чтобы помочь в этом, я пишу аспект (в рамках научного проекта) для регистрации ключевой информации по мере выполнения математического кода (и научного кода).


пример
Я запускаю простой пример аспекта вдоль линий из:
package org.science.example;

public aspect ScientificLog {
    public pointcut testCut() : execution (public * *.*(..));
    before() : testCut() {
        //do stuff
    }
}



Проблема в том, что независимо от того, какой pointcut я создаю, он только советует код из научный проект. Нет классов от org.math.example несколько квершлаг, вообще!

я пробовал добавлять проект по математике до inpath на научный проект собирается proect properties > AspectJ Build > Inpath и нажмите кнопку добавить проект и выбираем проект по математике. Что не сработало, но, похоже, мне нужно что-то сделать в этом направлении.

спасибо заранее за любые предложения...

-gMale


EDIT 1:
С момента написания этого, я заметил, что проект дает следующую ошибку:
Caused by: org.aspectj.weaver.BCException: Unable to continue, this version of AspectJ
supports classes built with weaver version 6.0 but the class
com.our.project.adapter.GenericMessagingAdapter is version 7.0
when batch building BuildConfig[null] #Files=52 AopXmls=#0

так что, возможно, это правильно настроено, и ошибка более тонкая. Кстати, упомянутый класс из "научного проекта", так сказать. Это происходит даже после очистки проекта. Я сейчас погуглил этот ошибка...


EDIT 2:
Я нашел решение ошибки выше в комментарий #5 здесь

проблема заключается в том, что POM-файл Maven-aspectj-plugin объявляет зависимость от aspectjtools версии 1.6.7. Таким образом, при настройке плагина эта временная зависимость должна быть изменена. Вот связанный фрагмент кода для файла pom, который устраняет проблему, указав версию 1.6.9 вместо 1.6.7:

                    <plugin>
                            <groupId>org.codehaus.mojo</groupId>
                            <artifactId>aspectj-maven-plugin</artifactId>
                            <version>1.3</version>
                            <dependencies>
                                <dependency>
                                    <groupId>org.aspectj</groupId>
                                    <artifactId>aspectjtools</artifactId>
                                    <version>1.6.9</version>
                                </dependency>
                            </dependencies>
                            <configuration>
                                    <source>1.6</source>
                                    <target>1.6</target>
                            </configuration>
                            <executions>
                                    <execution>
                                            <goals>
                                                    <goal>compile</goal>
                                                    <goal>test-compile</goal>
                                            </goals>
                                    </execution>
                            </executions>
                    </plugin>

2 ответов


вторая ваша проблема не связана с первой. Он говорит, что com.наш.проект.адаптер.GenericMessagingAdapter был первоначально скомпилирован и сплетен против новой версии AspectJ, но используется для двоичного переплетения против более старой версии AspectJ.

Это по существу та же проблема, что и при попытке запустить классы Java, скомпилированные под 1.6 на 1.5 VM.

номер версии был увеличен для выпуска AspectJ 1.6.8 (я думаю, или, может быть, это было 1.6.7).

решение состоит в том, чтобы убедиться, что вы используете последнюю версию AspectJ для всех ваших проектов (например, - 1.6.9 или dev-сборки 1.6.10).


когда вы добавляете математический проект в in path of science project, весь код математического проекта отправляется через aspectj weaver и правильно сплетается. Результаты этого переплетения записываются в выходную папку science project (а не Math project). Итак, если вы посмотрите в папке bin science project, вы увидите там сплетенные классы.

Если вы хотите сохранить файлы in path отдельно от обычных файлов, вы можете указать папку inpath out. Эта папка должна также будет добавлен в путь к классу как двоичная папка. Кроме того, эта папка должна быть размещена над зависимостью проекта от проекта Math на вкладке "экспорт и порядок" страницы сборки Java для научного проекта.

наконец, если вы запустите основной класс из научного проекта, а не из Математического проекта, вы будете выполнять сплетенный код.