Perché AspectJ non compilare in tempo la tessitura di lavoro @Configurable di primavera?
-
05-09-2019 - |
Domanda
Aggiornamento 5: Ho scaricato l'ultima primavera ToolsSuite IDE basato su Eclipse ultima. Quando importo il mio progetto come un progetto Maven, Eclipse / STS sembra utilizzare gli obiettivi Maven per costruire il mio progetto. Questo significa AspectJ finalmente funziona correttamente in Eclipse.
Aggiornamento 4:. Ho finito solo usando Maven + AspectJ plug-in per la tessitura in fase di compilazione, bypassando in modo efficace il meccanismo di Eclipse
Aggiornamento 3: Sembra pause plug-in capacità di AspectJ Eclipse di Eclipse per pubblicare correttamente per Tomcat. Solo rimuovendo la capacità di AspectJ su un progetto che posso farlo Pubblica di nuovo correttamente. Molto fastidioso.
Aggiornamento 2: Ho questo ora lavora in Eclipse. Mi rende molto a disagio a dire questo, ma non ho idea di come ho ottenuto che funziona sia da Eclipse o Maven costruisce. Sembra essere un problema di compilazione, piuttosto che un problema di run-time.
Aggiornamento 1: Sembra che ho ottenuto questo al lavoro tramite Maven costruisce, ma non ho idea di come fare. Eclipse continua a non funzionare. L'unica cosa che ho cambiato in pom.xml è stata l'aggiunta di questi parametri di configurazione (insignificante?):
<source>1.6</source>
<complianceLevel>1.6</complianceLevel>
<verbose>true</verbose>
<showWeaveInfo>true</showWeaveInfo>
<outxml>true</outxml>
Sono davvero preoccupato che ho una ripetizione di questo problema , dove tutto funziona in modo incoerente. Terrò questa domanda aggiornato come ho imparato di più.
Per quanto riguarda Eclipse, ho fatto qualche progresso, prendendo gli aspetti binari desidero tessere - in questo caso primavera-aspects.jar - e copiandolo dal mio classpath. Ho quindi aggiungere questo barattolo ora esterna alla mia Aspetto Percorso . Dopo aver fatto questo, Eclipse mostra correttamente mi marcatori AspectJ nel mio codice. E 'fastidioso che non posso lasciare primavera-aspects.jar nel mio costruire il percorso Java , che è gestito da Maven per me tramite il Maven plug-in. Per qualche ragione, però, l'AspectJ plug-in non vede gli aspetti binari a meno che siano esplicitamente aggiunti al Aspetto Percorso .
post originale: @Configurable è un'annotazione molla che consente dipendenze da iniettare in oggetti istanziati esterno molla (ad esempio, mediante sospensione o una classe di fabbrica)
.Io sto usando questa annotazione in precedenza con la tessitura load-time e lo più ha funzionato. Di tanto in tanto mi avviare e nulla sarebbe ottenere iniettato. Questo problema ha generato questa domanda StackOverflow . Non c'erano molte risposte, ma la maggior parte ha suggerito che provo compilazione tempo tessendo invece a causa di una maggiore affidabilità.
Ho installato il plug-in per Eclipse AspectJ e Maven. Entrambi questi producono quello che sembra essere classi correttamente compilati. Ho aperto una delle classi in un editor di testo prima della compilazione AspectJ e ho trovato riferimenti a AspectJ. Ho aperto dopo la compilazione AspectJ ed entrambi Eclipse e Maven generato le versioni hanno un riferimento a org.aspectj.weaver.MethodDeclarationLineNumber . Questo è il motivo per cui presumo che è essere adeguatamente compilato. Il problema è che, una volta implementato, senza dipendenze vengono iniettate.
La mia Primavera applicationContext.xml non includere le seguenti:
<context:spring-configured />
<context:component-scan base-package="com.myapp" />
È possibile che questo tutto ciò che serve per le classi contrassegnato @Configurable di aver DI fatto? Durante la conversione da load-time tessitura per compilare in tempo la tessitura, ho rimosso META-INF / aop.xml ,
Come posso studiare questo problema ulteriormente? Quali sono le possibili cause?
Soluzione
Si lavora per noi su Maven usando compilazione tessitura tempo, prova ad aggiungere il plugin seguenti:
<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>
Il suo fatto come due fasi di esecuzione separati per consentire di aggiungere diverse librerie di aspetto per i test di unità e la compilazione.
Sono necessari i seguenti dipendenze aggiunto per la libreria di primavera-aspetti:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<scope>compile</scope>
</dependency>
Altri suggerimenti
Ho configurato con successo tessitura load-time nella mia app, se questa è un'alternativa per voi.
Il mio ambiente:
- JDK-1.6
- Primavera-2.5.6
- JPA con EclipseLink-1.1.0
I dettagli di configurazione:
configurazione XML Primavera:
<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>
annotazioni Primavera
@Configurable("baseEntity")
public abstract class BaseEntity
@Configurable("historyHandler")
public class HistoryJpaHandler extends SessionEventAdapter implements HistoryHandler
Java VM Parametro
<JAVA_HOME>/bin/java -javaagent:/full/path/to/spring-agent-2.5.6.jar
Le istanze di historyHandler e baseEntitty sono creati da ecliselink. historyHandler in baseEntitty e historyDao in historyHandler viene impostato da carico timeweaving.
È possibile impostare il VM parametri in Eclipse configurazione di esecuzione o in Tomcats catalina.sh/bat.
fare un campo di una classe @configurable Autowired getta NullPointerException se non si configura la vostra primavera correttamente per questa annotazione. attenersi alla seguente procedura per fare annotazioni @configurable funzionano correttamente
Questo metodo viene chiamato AspectJ costruire tempo tessitura di iniettare i fagioli di primavera alle classi non-molla-made .
Il primo passo è quello di installare questi plugin in Eclipse:
Da questi due siti di aggiornamento installare qualsiasi eclissi suggerisce:
http://download.eclipse.org/tools/ajdt/43/update
http://dist.springsource.org/release/AJDT/configurator/
Dopo l'installazione, fare clic destro sul progetto e fare:
Configure > Convert to Aspectj
Maven > Update
Successivamente, è necessario aggiungere questi alla vostra pom.xml:
Sotto Dipendenze Aggiungi:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.0.2.RELEASE</version>
</dependency>
sotto plugins Aggiungi:
<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>
Importante: NON usare qualsiasi tag <pluginManagment>
sotto tag <build>
.
il vostro pom.xml ha bisogno di essere qualcosa di simile:
<project ....>
....
<dependencies>
<dependency>
....
</dependency>
....
</dependencies>
<build>
<plugins>
<plugin>
....
</plugin>
....
</plugins>
</build>
</project>
, infine, aggiungere <context:spring-configured />
al file di configurazione dell'applicazione contesto primavera.
Ora è possibile annotare una classe POJO come @Configurable
e iniettare fagioli in primavera utilizzando @Autowired
annotazione. in questo modo ogni volta che si effettua una nuova istanza di tale POJO esso sarà configurato (ad esempio iniettato con dipendenze) automaticamente.
Per quanto riguarda i problemi di classpath Eclipse sono interessati, si potrebbe trovare questo utile.
Il plug m2eclipse ha un optional integrazione AJDT . L'integrazione legge la sezione aspectLibraries della configurazione del aspectj-maven-plugin, e contribuisce i vasi a Eclipse Path Aspect.