2012-04-05 10 views
8

Ho provato a configurare load-time tessitura (per fare profilatura con Perf4J) nel modo seguente:Come configurare la tessitura a tempo di caricamento con AspectJ e Tomcat?

1) ho aggiunto aop.xml nella cartella META-INF. Quando viene distribuito, META-INF viene inserito nella directory root artefatto (ad esempio MyAppDeployed/META-INF).

2) Ho messo aspectjrt-1.6.1.jar, aspectjweaver-1.6.1.jar, commons-jexl-1.1.jar, commons-logging.jar alla cartella Tomcat/lib (in un primo momento ho cercato MyAppDeployed/WEB-INF/libs ma anche non ha funzionato).

3) Ho aggiunto -javaagent:C:\apache-tomcat-6.0.33\lib\aspectjweaver-1.6.1.jar alle opzioni della VM all'avvio di Tomcat.

4) Il mio aop.xml:

<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> 

<aspectj> 

    <aspects> 
     <aspect name="org.perf4j.log4j.aop.TimingAspect"/> 
    </aspects> 

    <weaver options="-verbose -showWeaveInfo">   
     <include within="com.mypackages.MyClass"/> 
    </weaver> 
</aspectj> 

non vedo alcun segno che la tessitura load-time succede. Né segnalazioni di errori né risultati necessari. L'unico messaggio di errore che ho è:

Error occurred during initialization of VM 
agent library failed to init: instrument 
Error opening zip file: C:\apache-tomcat-6.0.33\lib\wrong-jar.jar 

in un caso quando faccio un errore in un nome aspectjweaver-1.6.1.jar quando specificare un parametro javaagent. Se è scritto correttamente, non viene stampato alcun messaggio di errore.

Qualche idea, cosa sto sbagliando?

P.S. Io uso Java 5 e ho provato le stesse cose con la versione 1.5.4 dell'aspetto con esattamente gli stessi risultati.

+0

Hai mai capito questo problema? Sto cercando di configurare Aspectj + tomcat con il tempo di caricamento in Eclipse. Nello specifico sto cercando di tessere JSP ma non ho fortuna. – bsimic

+0

Ho una situazione simile ma ho funzionato quando l'annotazione si trova sulla mia classe di implementazione. Il tuo com.mypackages.MyClass è un'interfaccia o un'implementazione? I miei aspetti non si intessevano quando ho l'annotazione sull'interfaccia. Inoltre un'altra cosa che ho il file aop.xml sotto ../webapps/MyAppDeployed/WEB-INF/classes/META-INF/aop.xml non sono sicuro se questo fa la differenza. – dineshr

risposta

4

Se si desidera utilizzare la tessitura tempo di caricamento, è possibile innanzitutto compilare i vostri classi con javac come al solito quindi compilare il vostro aspetto (s) con (i) AJC. Si può fare questo con un compito formica come qui di seguito

<target name="compile-aspect"> 
    <iajc source="1.6" target="1.6" showweaveinfo="true" verbose="true" outxml="true" debug="true" outjar="${dist.dir}/myaspect.jar"> 
      <argfiles> 
        <pathelement location="${src.dir}/sources.lst"/> 
      </argfiles> 
      <classpath> 
        <path refid="master-classpath" /> 
      </classpath> 
    </iajc> 
</target> 

E 'sufficiente avere aspectjrt.jar nel classpath ("master-percorso di classe") durante la compilazione.

Poiché tutte le mie classi Java in $ {src.dir}, fornisco un elenco di origini a iajc. Nell'elenco sorgente c'è solo una riga.

sources.lst

com/xx/yy/zz/LoggingAspect.java 

ho impostare alcuni degli attributi di attività come segue iajc

outxml="true" 
outjar="jar_file_name" 

Quando eseguo compilazione aspetto compito Ho un barattolo jar_file_name.jar file contiene

META-INF/MANIFEST.MF 
com/xx/yy/zz/LoggingAspect.class 
META-INF/aop-ajc.xml 

Infine aggiungere * jar_file_name.jar * alla cartella WEB-INF/lib della propria applicazione Web.

Quindi avviare Tomcat con -javaagents: /path_to_aspectjweaver.jar come in precedenza.

Quando ho messo il file aop.xml (o aop-ajc.xml) in META-INF direttamente nel file di guerra, non funziona. In questo modo (intendo separare le classi di aspetto in un barattolo) funziona perfettamente per me.

Spero che questo aiuti.

+1

Questa soluzione ha funzionato per me. Il punto che mi mancava e la strega è ovviamente molto importante è il tag 'outxml =" true "' quando costruisci. Senza questo, non si ha il 'META-INF/aop-ajc.xml' che aspectjweaver usa per sapere quali sono gli _aspetti da applicare. –

4

Stavo cercando di risolvere lo stesso problema in Tomcat. Oltre all'opzione -javaagent, è necessario assicurarsi che aop.xml sia nella directory WEB-INF/classes/META-INF. Questo ha fatto la differenza per me.

+0

Ha funzionato anche per me –

Problemi correlati