Почему AspectJ не компилирует во время компиляции работы Spring @Configurable?
Обновление 5: я загрузил последнюю версию Spring ToolsSuite IDE, основанную на последней версии Eclipse. Когда я импортирую свой проект как проект Maven, Eclipse/STS использует цели Maven для создания моего проекта. Это означает, что AspectJ наконец-то правильно работает в Eclipse.
Обновление 4: я просто использовал плагин Maven + AspectJ для создания компиляции во время компиляции, эффективно обходя механизм Eclipse.
Обновление 3: похоже, что плагин Epectipse от AspectJ нарушает способность 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, я добился определенного прогресса, взяв бинарные аспекты, которые я хотел бы сплести, - в данном случае spring-aspect.jar - и скопировав их из моего пути к классам. Затем я добавляю этот теперь внешний jar в мой Aspect Path. После этого Eclipse правильно показывает мне маркеры AspectJ в моем коде. Раздражает, что я не могу просто оставить spring-aspect.jar в своем пути сборки Java, который поддерживается для меня Maven через плагин Maven. Однако по какой-то причине плагин AspectJ не видит двоичные аспекты, если они явно не добавлены в Aspect Path.
Исходное сообщение: @Configurable - это аннотация Spring, которая позволяет вставлять зависимости в объекты, созданные вне Spring (например, с помощью Hibernate или некоторого класса Factory).
Ранее я использовал эту аннотацию с ткачеством во время загрузки, и она в основном работала. Иногда я загружался, и ничего не вводили. Эта проблема породила этот вопрос Stackru. Было не так много ответов, но большинство предложили вместо этого попробовать ткачество во время компиляции из-за большей надежности.
Я установил плагин AspectJ для Eclipse и Maven. Оба они производят то, что кажется правильно скомпилированными классами. Я открыл один из классов в текстовом редакторе перед компиляцией AspectJ и не нашел ссылок на AspectJ. Я открыл его после компиляции AspectJ, и сгенерированные версии Eclipse и Maven имеют ссылку на org.aspectj.weaver.MethodDeclarationLineNumber. Вот почему я предполагаю, что он правильно компилируется. Проблема в том, что после развертывания никакие зависимости не вводятся.
My Spring applicationContext.xml включает в себя следующее:
<context:spring-configured />
<context:component-scan base-package="com.myapp" />
Выше всего, что нужно для классов, помеченных @Configurable, чтобы DI сделал? Во время преобразования из ткачества во время загрузки в ткачество во время компиляции я удалил META-INF / aop.xml,
Как я могу исследовать эту проблему дальше? Каковы возможные причины?
4 ответа
Это работает для нас на 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-aspect:
<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 VM
<JAVA_HOME>/bin/java -javaagent:/full/path/to/spring-agent-2.5.6.jar
Экземпляры historyHandler и baseEntitty создаются программой ecliselink. historyHandler в baseEntitty и historyDao в historyHandler задается ткачеством загрузки.
Вы можете установить параметр VM в конфигурации запуска Eclipse или в Tomcats catalina.sh/bat.
Создание поля класса @configurable Autowired создает исключение NullPointerException, если вы не настроили свою пружину должным образом для этой аннотации. выполните следующие шаги, чтобы аннотации @configurable работали должным образом
Этот метод называется сплетением времени сборки AspectJ, чтобы внедрить пружинные бины в классы, не созданные весной.
Первый шаг - установить эти плагины в 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 />
в конфигурационный файл вашего весеннего приложения.
Теперь вы можете аннотировать класс POJO как @Configurable
и введите в него весенние бобы, используя @Autowired
аннотаций. таким образом, всякий раз, когда вы создаете новый экземпляр этого POJO, он будет автоматически конфигурироваться (например, вводиться с зависимостями).
Что касается ваших проблем с Eclipse, вы можете найти это полезным.
Плагин m2eclipse имеет дополнительную интеграцию AJDT. Интеграция считывает раздел aspectLibraries в конфигурации aspectj-maven-plugin и вносит файлы jar в Aspect Path Eclipse.