2012-04-05 6 views
8

Ich habe versucht, Ladezeit Weben (dafür Profilierung mit Perf4J) in den nächsten Weg zu konfigurieren:Wie konfiguriere ich Ladezeitweben mit AspectJ und Tomcat?

1) Ich aop.xml zu META-INF Ordner hinzugefügt. Bei der Bereitstellung wird META-INF in das Wurzelverzeichnis des Artefakts gestellt (d. H. MyAppDeployed/META-INF).

2) Ich habe aspectjrt-1.6.1.jar, aspectjweaver-1.6.1.jar, commons-jexl-1.1.jar, commons-logging.jar zum Tomcat/lib Ordner (auf den ersten habe ich versucht, MyAppDeployed/WEB-INF/libs aber es ging auch nicht).

3) Ich habe -javaagent:C:\apache-tomcat-6.0.33\lib\aspectjweaver-1.6.1.jar den VM-Optionen beim Starten von Tomcat hinzugefügt.

4) Mein 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> 

Ich sehe keine Anzeichen dafür, dass die Ladezeit Weben geschieht. Weder Fehlerberichte noch notwendige Ergebnisse. Die einzige Fehlermeldung, die ich habe, ist:

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 einem Fall, wenn ich einen Fehler in einem aspectjweaver-1.6.1.jar Namen tun, wenn ein javaagent Parameter angeben. Wenn es richtig geschrieben ist - keine Fehlermeldungen werden gedruckt.

Irgendwelche Ideen, was mache ich falsch?

P.S. Ich benutze Java 5, und ich habe die gleichen Dinge mit 1.5.4 Version des Aspektj mit genau den gleichen Ergebnissen versucht.

+0

Haben Sie dieses Problem jemals herausgefunden? Ich versuche Aspectj + Tomcat mit Ladezeitweben in Eclipse zu konfigurieren. Insbesondere versuche ich JSPs zu weben, habe aber kein Glück. – bsimic

+0

Ich habe eine ähnliche Situation, aber es funktioniert, wenn die Annotation auf meiner Implementierung Klasse ist. Ist Ihre com.mypackages.MyClass eine Schnittstelle oder eine Implementierung? Meine Aspekte wurden nicht gewebt, wenn ich die Anmerkung auf der Schnittstelle habe. Auch eine weitere Sache habe ich die aop.xml-Datei unter ../webapps/MyAppDeployed/WEB-INF/classes/META-INF/aop.xml nicht sicher, ob das einen Unterschied macht. – dineshr

Antwort

4

Wenn Sie die Ladezeit Weben verwenden möchten, können Sie zunächst Ihre Klassen mit Javac kompilieren wie üblich dann Aspekt kompilieren (n) mit (i) ajc. Sie können wie mit einer Ameise Aufgabe dies tun unter

<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> 

Es reicht aspectjrt.jar im Classpath zu haben („Master-Classpath“) während der Kompilierung.

Da alle meine Java-Klassen in $ {src.dir}, gebe ich eine Quellenliste zu iajc. In der Quellenliste gibt es nur eine Zeile.

sources.lst

com/xx/yy/zz/LoggingAspect.java 

stelle ich einige iajc Attribute Aufgabe als

outxml="true" 
outjar="jar_file_name" 

folgt Wenn ich kompilieren-Aspekt ausführen Aufgabe Ich habe ein Glas jar_file_name.jar Datei enthält

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

Und schließlich fügen Sie die * jar_file_name.jar * WEB-INF/lib Ordner Ihrer Webanwendung hinzu.

Starten Sie dann Tomcat mit -javaagents: /path_to_aspectjweaver.jar wie zuvor.

Wenn ich die aop.xml (oder aop-ajc.xml) in META-INF direkt unter der WAR-Datei ablegen, funktioniert das nicht. Auf diese Weise (ich meine, dass ich Aspect-Klassen in ein Glas zerlege) funktioniert es einfach gut für mich.

Hoffe, das hilft.

+1

Diese Lösung hat für mich funktioniert. Der Punkt, den ich vermisste und der Hexe offensichtlich sehr wichtig ist, ist das Tag 'outxml =" true "' beim Bauen. Ohne dies haben Sie nicht die 'META-INF/aop-ajc.xml', die der aspectjweaver verwendet, um zu wissen, welche _aspects_ zutreffen. –

4

Ich habe versucht, das gleiche Problem in Tomcat zu lösen. Zusätzlich zur Option -javaagent müssen Sie sicherstellen, dass sich die Datei aop.xml im Verzeichnis WEB-INF/classes/META-INF befindet. Das machte den Unterschied für mich.

+0

Es hat auch für mich funktioniert –