Почему AspectJ не работает во время компиляции Spring @Configurable?
-
05-09-2019 - |
Вопрос
Обновление 5: Я загрузил последнюю версию среды разработки Spring ToolsSuite, основанную на последней версии Eclipse.Когда я импортирую свой проект как проект Maven, Eclipse/STS, похоже, использует цели Maven для создания моего проекта.Это означает, что AspectJ наконец-то корректно работает в Eclipse.
Обновление 4: В итоге я просто использовал плагин Maven + AspectJ для переплетения во время компиляции, эффективно обходя механизм Eclipse.
Обновление 3: Кажется, что плагин AspectJ для Eclipse нарушает способность Eclipse правильно публиковать в Tomcat.Только удалив возможность AspectJ в проекте, я смогу снова правильно опубликовать его.Очень надоедливый.
Обновление 2: У меня это сейчас работает в Eclipse.Мне очень неудобно это говорить, но я понятия не имею, как мне удалось заставить это работать на сборках Eclipse или Maven.Похоже, это проблема компиляции, а не проблема во время выполнения.
Обновление 1: Кажется, мне удалось заставить это работать с помощью сборок Maven, но я понятия не имею, как это сделать.Затмение все еще не работает.Единственное, что я изменил в pom.xml добавлял эти (незначительные?) параметры конфигурации:
<source>1.6</source>
<complianceLevel>1.6</complianceLevel>
<verbose>true</verbose>
<showWeaveInfo>true</showWeaveInfo>
<outxml>true</outxml>
Я на самом деле беспокоюсь, что у меня есть повторение Эта проблема, где все работает непоследовательно.Я буду обновлять этот вопрос по мере того, как узнаю больше.
Что касается Eclipse, я добился некоторого прогресса, взяв бинарные аспекты, которые хочу сплести - в данном случае весна-aspects.jar - и копирую его из моего пути к классам.Затем я добавляю этот внешний jar в свой Аспектный путь.После этого Eclipse правильно отображает маркеры AspectJ в моем коде.Меня раздражает, что я не могу просто уйти весна-aspects.jar в моем Путь сборки Java который поддерживается Maven для меня через плагин Maven.Однако по какой-то причине плагин AspectJ не видит двоичные аспекты, если они явно не добавлены в файл. Аспектный путь.
Исходное сообщение: @Configurable — это аннотация Spring, которая позволяет внедрять зависимости в объекты, экземпляры которых создаются вне Spring (например, с помощью Hibernate или какого-либо класса Factory).
Ранее я использовал эту аннотацию при переплетении во время загрузки, и она по большей части работал.Иногда я загружался, и ничего не вводилось.Эта проблема породила этот вопрос StackOverflow.Ответов было не так много, но большинство предлагали вместо этого попробовать плетение во время компиляции из-за большей надежности.
Я установил плагин AspectJ для Eclipse и Maven.Оба они создают то, что выглядит правильно скомпилированными классами.Я открыл один из классов в текстовом редакторе перед компиляцией AspectJ и не нашел никаких упоминаний об AspectJ.Я открыл его после компиляции AspectJ, и обе версии, созданные Eclipse и Maven, имеют ссылку на org.aspectj.weaver.MethodDeclarationLineNumber.Вот почему я предполагаю, что он правильно скомпилирован.Проблема в том, что после развертывания никакие зависимости не внедряются.
Моя весна applicationContext.xml включает в себя следующее:
<context:spring-configured />
<context:component-scan base-package="com.myapp" />
Является ли все вышеперечисленное необходимым для классов с пометкой @Configurable для выполнения DI?Во время преобразования из процесса загрузки во время компиляции я удалил МЕТА-INF/aop.xml, <context:load-time-weaver /> от моего applicationContext.xml, и Spring's Tomcat Weaver из моего context.xml.
Как я могу изучить эту проблему дальше?Каковы возможные причины?
Решение
У нас это работает на maven с использованием плетения времени компиляции, попробуйте добавить следующие плагины:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerVersion>1.6</compilerVersion>
<fork>true</fork>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<executions>
<execution>
<id>compile</id>
<configuration>
<source>1.6</source>
<target>1.6</target>
<verbose>false</verbose>
<outxml>true</outxml>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<configuration>
<source>1.6</source>
<target>1.6</target>
<verbose>false</verbose>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.4</version>
</dependency>
</dependencies>
</plugin>
Это выполнено в виде двух отдельных этапов выполнения, что позволяет вам добавлять различные библиотеки аспектов для модульного тестирования и компиляции.
Вам также понадобится добавить следующую зависимость для библиотеки Spring-Aspects:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<scope>compile</scope>
</dependency>
Другие советы
Я успешно настроил плетение во время загрузки в своем приложении, если это альтернатива для вас.
Мое окружение:
- JDK-1.6
- Весна-2.5.6
- JPA с eclipselink-1.1.0
Детали конфигурации:
Конфигурация Spring XML:
<context:annotation-config/>
<context:spring-configured/>
<context:load-time-weaver/>
<bean id="baseEntity" class="package.name.BaseEntity" scope="prototype">
<property name="historyHandler" ref="historyHandler" />
</bean>
<bean id="historyHandler" class="package.name.HistoryJpaHandler" scope="prototype">
<property name="historyDao" ref="historyDao" />
</bean>
<bean id="historyDao" class="package.name.HistoryJpaDao">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
Весенние аннотации
@Configurable("baseEntity")
public abstract class BaseEntity
@Configurable("historyHandler")
public class HistoryJpaHandler extends SessionEventAdapter implements HistoryHandler
Параметр виртуальной машины Java
<JAVA_HOME>/bin/java -javaagent:/full/path/to/spring-agent-2.5.6.jar
Экземпляры HistoryHandler и baseEntitty создаются с помощью ecliselink.HistoryHandler в baseEntitty и HistoryDao в HistoryHandler устанавливаются путем переплетения времени загрузки.
Вы можете установить параметр виртуальной машины в конфигурации запуска Eclipse или в Tomcats catalina.sh/bat.
создание поля класса @configurable Autowired выдает исключение NullPointerException, если вы неправильно настроили пружину для этой аннотации.выполните следующие действия, чтобы аннотации @configurable работали правильно.
Этот метод называется AspectJ создает плетение времени для внедрения Spring Beans в ваши классы, не созданные на Spring..
Первый шаг — установить эти плагины в eclipse:
С этих двух сайтов обновлений установите все, что предлагает eclipse:
http://download.eclipse.org/tools/ajdt/43/update
http://dist.springsource.org/release/AJDT/configurator/
После установки щелкните правой кнопкой мыши проект и выполните:
Configure > Convert to Aspectj
Maven > Update
Далее вам нужно добавить их в ваш pom.xml:
В разделе «Зависимости» добавьте:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.0.2.RELEASE</version>
</dependency>
В разделе «Плагины» добавьте:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.5</version>
<configuration>
<showWeaveInfo>true</showWeaveInfo>
<source>1.7</source>
<target>1.7</target>
<Xlint>ignore</Xlint>
<complianceLevel>1.7</complianceLevel>
<encoding>UTF-8</encoding>
<verbose>false</verbose>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.7.0</version>
</dependency>
</dependencies>
</plugin>
Важный: НЕ используйте никаких <pluginManagment>
отметить под <build>
ярлык.ваш pom.xml должен быть примерно таким:
<project ....>
....
<dependencies>
<dependency>
....
</dependency>
....
</dependencies>
<build>
<plugins>
<plugin>
....
</plugin>
....
</plugins>
</build>
</project>
наконец добавь <context:spring-configured />
в файл конфигурации контекста вашего приложения Spring.
Теперь вы можете аннотировать класс POJO как @Configurable
и добавьте в него зеленую фасоль, используя @Autowired
аннотация.таким образом, всякий раз, когда вы создаете новый экземпляр этого POJO, он будет настроен (например.с добавлением зависимостей) автоматически.
Что касается ваших проблем с путями классов Eclipse, вы можете найти это полезным.
А плагин m2eclipse имеет дополнительный Интеграция AJDT.Интеграция считывает раздел аспектных библиотек конфигурации аспекта-maven-плагина и добавляет файлы jar в Aspect Path Eclipse.