2010-09-09 10 views
6

Questo dovrebbe essere semplice.AspectJ: Come ottenere punti per consigliare classi situate in altri progetti

Domanda
Come si ottiene un pointcut in un progetto di consigliare il codice/classi all'interno di un altro progetto?


Contesto
Sto lavorando in eclissi con due progetti. Per facilità di spiegazione, chiamiamola una progetto scientifico e l'altro progetto matematica e dicono che il progetto scientifico si basa sul progetto di matematica e sto sviluppando in entrambi i progetti, in concomitanza. Il progetto matematico è un prodotto di base, in produzione, e la vita sarà più facile se non modifico molto il codice.

Attualmente sto eseguendo il debug dell'interazione tra questi due progetti. Per aiutarlo, sto scrivendo un Aspect (all'interno del progetto scientifico) per registrare le informazioni chiave mentre il codice matematico (e il codice scientifico) vengono eseguiti.


Esempio
ho eseguendo un aspetto semplice esempio lungo le linee di:

package org.science.example; 

public aspect ScientificLog { 
    public pointcut testCut() : execution (public * *.*(..)); 
    before() : testCut() { 
     //do stuff 
    } 
} 


Problemi
Il problema è, non importa quale pointcut Creo, esso consigliati solo codice dal progetto scientifico . Nessuna classe da org.math.example è crosscut, A TUTTI!

Ho provato ad aggiungere al progetto matematica al INPATH del progetto scienza andando a proect properties > AspectJ Build > Inpath e cliccando progetto del componente aggiuntivo e scegliendo il progetto matematica. Non ha funzionato, ma sembra che ho bisogno di fare qualcosa in questo senso.

Grazie, in anticipo, per eventuali suggerimenti ...

-gMale


EDIT 1:
Dopo aver scritto questo, ho notato il progetto sta dando il seguente errore:

Caused by: org.aspectj.weaver.BCException: Unable to continue, this version of AspectJ 
supports classes built with weaver version 6.0 but the class 
com.our.project.adapter.GenericMessagingAdapter is version 7.0 
when batch building BuildConfig[null] #Files=52 AopXmls=#0

Quindi forse questo è configurato correttamente e l'errore è più sottile. A proposito, la classe menzionata proviene dal "progetto scientifico", per così dire. Questo succede anche dopo aver pulito il progetto. Attualmente sto googling questo errore ...


EDIT 2:
ho trovato la soluzione per l'errore precedente in comment #5 here

Il problema è il file pom del maven-aspectj-plugin dichiara una dipendenza aspectjtools versione 1.6 .7. Quindi, quando si configura il plugin, è necessario modificare la dipendenza del transiente. Ecco lo snippet di codice correlato per il file pom che corregge il problema specificando la versione 1.6.9 anziché 1.6.7:

    <plugin> 
          <groupId>org.codehaus.mojo</groupId> 
          <artifactId>aspectj-maven-plugin</artifactId> 
          <version>1.3</version> 
          <dependencies> 
           <dependency> 
            <groupId>org.aspectj</groupId> 
            <artifactId>aspectjtools</artifactId> 
            <version>1.6.9</version> 
           </dependency> 
          </dependencies> 
          <configuration> 
            <source>1.6</source> 
            <target>1.6</target> 
          </configuration> 
          <executions> 
            <execution> 
              <goals> 
                <goal>compile</goal> 
                <goal>test-compile</goal> 
              </goals> 
            </execution> 
          </executions> 
        </plugin> 

risposta

4

Il tuo secondo problema non è correlato al primo. Si dice che com.our.project.adapter.GenericMessagingAdapter sia stato originariamente compilato e tessuto con una nuova versione di AspectJ, ma che venga utilizzato per l'intreccio binario rispetto ad una versione precedente di AspectJ.

Questo è essenzialmente lo stesso problema di quando si tenta di eseguire classi Java compilate in 1.6 su un 1.5 VM.

Il numero di versione è stato revocato per il rilascio di AspectJ 1.6.8 (penso, o forse era 1.6.7).

La soluzione è assicurarsi di utilizzare l'ultima versione di AspectJ per tutti i progetti (ad es. 1.6.9 o versioni di sviluppo di 1.6.10).

+0

Grazie, hai ragione. Ho appena risolto l'eccezione e aggiornato la mia domanda sopra, di conseguenza. Sfortunatamente, per il momento, sono stato essenzialmente istruito a portare il "progetto matematico" direttamente nel "progetto scientifico". Chiaramente, questo evita il problema, ma non sono in grado di determinare l'impatto della correzione del secondo bug perché la base del codice è completamente diversa ora e il backtracking in sovversione richiederebbe troppo tempo. Grazie per l'aiuto. Poiché tu sei l'unica risposta, voterò tutti i tuoi messaggi e ti ricompenserò della risposta. Grazie! – gMale

2

Quando si aggiunge progetto Math al di percorso di progetto di scienza, tutto il codice del progetto per la matematica viene inviato attraverso il tessitore aspectj e adeguatamente tessute. I risultati di tale trama sono scritti nella cartella di output del progetto scientifico (non nel progetto Math). Quindi, se dovessi guardare nella cartella bin del progetto scientifico, dovresti vedere le classi tessute lì.

Se si desidera mantenere separati i file di percorso dai file normali, è possibile specificare una cartella fuori percorso. Questa cartella dovrebbe anche essere aggiunta al percorso della classe come cartella binaria. Inoltre, questa cartella deve essere posizionata sopra la dipendenza del progetto nel progetto Math nella scheda "Esporta e ordina" della pagina di build Java per il progetto Science.

Infine, se si esegue la classe principale dal progetto Science, anziché dal progetto Math, si eseguirà il codice tessuto.

+0

Grazie per la risposta. Fondamentalmente, mi hai confermato che dovrei essere in grado di farlo funzionare e che l'inpath era la strada giusta da percorrere. Da quando ho scritto la domanda, ho notato un errore che attualmente sto cercando su Google. Forse è l'unico problema ... aggiornerò la domanda con l'errore. – gMale