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 , dal mio applicationContext.xml , e Tomcat Primavera tessitore dalla mia context.xml .

Come posso studiare questo problema ulteriormente? Quali sono le possibili cause?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top