Почему AspectJ не компилирует время во время Spring @Configurable work?
Обновление 5: Я загрузил последнюю версию Spring ToolsSuite IDE на основе последнего Eclipse. Когда я импортирую проект как проект Maven, Eclipse/STS, похоже, использует цели Maven для создания моего проекта. Это означает, что AspectJ, наконец, корректно работает в Eclipse.
Обновление 4: Я просто использовал Maven + AspectJ-плагин для компиляции во времени, эффективно минуя механизм Eclipse.
Обновление 3: Кажется, что плагин AspectJ Eclipse разбивает способность Eclipse правильно опубликовать Tomcat. Только удалив возможность AspectJ в проекте, я могу заставить его правильно опубликовать. Очень раздражает.
Обновление 2: У меня теперь это работает в Eclipse. Мне очень неудобно говорить об этом, но я понятия не имею, как я получил работу от сборки Eclipse или Maven. Это, скорее всего, проблема компиляции, а не проблема времени выполнения.
Обновление 1: Похоже, я получил это, чтобы работать через сборки Maven, но я понятия не имею, как это сделать. Eclipse все еще не работает. Единственное, что я изменил в pom.xml, это добавить эти (незначительные?) Параметры конфигурации:
<source>1.6</source>
<complianceLevel>1.6</complianceLevel>
<verbose>true</verbose>
<showWeaveInfo>true</showWeaveInfo>
<outxml>true</outxml>
Я действительно беспокоюсь, что у меня есть повторение этой проблемы, где все работает непоследовательно. Я буду держать этот вопрос в курсе, когда узнаю больше.
Что касается Eclipse, я сделал некоторый прогресс, взяв двоичные аспекты, которые я хотел бы сплести - в этом случае spring -aspects.jar - и скопировать его из моего пути к классам. Затем я добавляю эту внешнюю банку в мой Aspect Path. После этого Eclipse правильно показывает мне маркеры AspectJ в моем коде. Это раздражает, что я не могу просто оставить spring -aspects.jar в моем пути сборки Java, который поддерживается Maven для меня через плагин Maven. По какой-то причине, однако, плагин AspectJ не видит двоичные аспекты, если они явно не добавлены в Aspect Path.
Исходный пост: @Configurable - это аннотация Spring, которая позволяет вставлять зависимости в объекты, созданные вне объекта Spring (например, с помощью Hibernate или некоторого класса Factory).
Я использовал эту аннотацию ранее с переплетением во времени и в основном работал. Иногда я загружался, и ничего не вводили. Эта проблема породила qaru.site/info/204128/.... Было не так много ответов, но большинство из них предложило вместо этого попытаться скомпилировать время за счет большей надежности.
Я установил плагин 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, < context: load-time-weaver/" > из моего applicationContext.xml и Spring Tomcat weaver из моего контекста .xml.
Как я могу исследовать эту проблему дальше? Каковы возможные причины?
Ответы
Ответ 1
Он работает для нас на 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>
Ответ 2
Я успешно настроил время загрузки во время моего приложения, если это альтернатива для вас.
Моя среда:
- JDK-1,6
- Spring -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>
Spring аннотации
@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
Экземпляры историиHandler и baseEntitty создаются с помощью ecliselink. historyHandler в baseEntitty и historyDao в historyHandler устанавливается с помощью load-timeweaving.
Вы можете установить параметр VM в конфигурации запуска Eclipse или в Tomcats catalina.sh/bat.
Ответ 3
создание поля @configurable класса Autowired throws NullPointerException, если вы не настроили свой spring правильно для этой аннотации.
выполните следующие действия, чтобы сделать @configurable аннотации работать правильно
Этот метод называется AspectJ build time weaving, чтобы вставить spring beans в классы, не связанные с spring.
Первый шаг - установить эти плагины в eclipse:
На этих двух сайтах обновлений установите все, что предлагает затмение:
http://download.eclipse.org/tools/ajdt/43/update
http://dist.springsource.org/release/AJDT/configurator/
После установки щелкните правой кнопкой мыши проект и выполните команду Do:
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
и вставить spring beans в него с помощью аннотации @Autowired
. таким образом, всякий раз, когда вы создаете новый экземпляр этого POJO, он автоматически настраивается (например, вводится с зависимостями).
Ответ 4
Что касается проблем с классом Eclipse, вы можете найти это полезным.
плагин m2eclipse имеет необязательный интеграция AJDT. Интеграция читает секцию aspectLibraries конфигурации aspectj-maven-plugin и вносит баннеры в Eclipse Aspect Path.