Подтвердить что ты не робот

Почему 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.

Как я могу исследовать эту проблему дальше? Каковы возможные причины?

4b9b3361

Ответ 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.