2010-09-09 7 views
6

Dies sollte einfach sein.AspectJ: So erhalten Sie Pointcuts zu beraten Klassen in anderen Projekten

Frage
Wie bekommt man ein pointcut in einem Projekt des Code/Klassen in einem anderen Projekt zu beraten?


Kontext
Ich arbeite in Eclipse mit zwei Projekten. Zur Erleichterung der Erklärung, lassen Sie sich und das andere Mathe Projekt und sagt, dass das Wissenschaftsprojekt stützt sich auf dem Mathematik-Projekt ein wissenschaftliches Projekt nennen, und ich bin in beiden Projekten zu entwickeln, gleichzeitig. Das Mathe-Projekt ist ein Kernprodukt in der Produktion, und das Leben wird einfacher, wenn ich den Code nicht viel modifiziere.

Momentan debugge ich die Interaktion zwischen diesen beiden Projekten. Um dies zu unterstützen, schreibe ich einen Aspect (innerhalb des Wissenschaftsprojekts), um wichtige Informationen zu protokollieren, während der Mathekode (und der Wissenschaftscode) ausgeführt werden.


Beispiel
ich entlang der Linien von einem einfachen Beispiel Aspekt ausgeführt wird:

package org.science.example; 

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


Problem
Das Problem ist, egal welche pointcut ich schaffen, es berät nur Code aus dem Wissenschaftsprojekt. Keine Klassen von org.math.example sind crosscut, AT ALL!

Ich versuchte, das Mathe Projekt zum INPATH des Projekts Wissenschaft Hinzufügen von
-proect properties > AspectJ Build > Inpath und klicken add Projekt und die Wahl der Mathe-Projekt gehen. Das hat nicht funktioniert, aber es scheint, als müsste ich etwas in dieser Richtung tun.

Dank im Voraus für irgendwelche Vorschläge ...

-gMale


EDIT 1:
Da dieses Schreiben habe ich das Projekt gibt die folgenden Fehler bemerkt:

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

Also vielleicht ist dies richtig eingerichtet und der Fehler ist subtiler. Übrigens stammt die genannte Klasse sozusagen aus dem "Science Project". Dies passiert auch, nachdem ich das Projekt gereinigt habe. Ich bin derzeit diesen Fehler googeln ...


EDIT 2:
fand ich die Lösung der oben genannten Fehler in comment #5 here

Das Problem ist die Maven-aspectj-Plugins pom-Datei eine Abhängigkeit von aspectjtools Version erklärt 1.6 .7. Bei der Konfiguration des Plugins muss diese Übergangsabhängigkeit modifiziert werden. Hier ist das zugehörige Code-Snippet für die Pom-Datei, das das Problem behebt, indem Version 1.6.9 statt 1.6 angegeben wird.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> 

Antwort

4

Ihr zweites Problem hat nichts mit dem ersten zu tun. Es sagt, dass com.our.project.adapter.GenericMessagingAdapter ursprünglich kompiliert und gegen eine neue Version von AspectJ gewebt wurde, aber verwendet wird, um gegen eine ältere Version von AspectJ binär zu weben.

Dies ist im Wesentlichen das gleiche Problem wie beim Versuch, unter 1.6 auf einer 1.5 VM kompilierte Java-Klassen auszuführen.

Die Versionsnummer wurde für die Veröffentlichung von AspectJ 1.6.8 aktualisiert (ich denke, oder vielleicht war es 1.6.7).

Die Lösung besteht darin, sicherzustellen, dass Sie die neueste Version von AspectJ für alle Ihre Projekte verwenden (zB 1.6.9 oder dev builds von 1.6.10).

+0

Danke, Sie sind genau richtig. Ich habe gerade die Ausnahme gelöst und dementsprechend meine Frage aktualisiert. Leider wurde ich im Interesse der Zeit angewiesen, das "Matheprojekt" direkt in das "Wissenschaftsprojekt" zu übernehmen. Natürlich vermeidet dies das Problem, aber ich bin nicht in der Lage, die Auswirkungen der Korrektur des zweiten Fehlers zu bestimmen, da die Codebasis jetzt komplett anders ist und das Zurückverfolgen in Subversion zu lange dauern würde. Danke für Ihre Hilfe. Da du die einzige Antwort bist, stimme ich alle deine Nachrichten ab und belohne dich mit der Antwort. Vielen Dank! – gMale

2

Wenn Sie Math Projekt der in Weg der Wissenschaft Projekt hinzufügen, die alle Codes des Mathe-Projekt wird durch die aspectj Weber und richtig gewebt geschickt. Die Ergebnisse dieses Webens werden in den Ausgabeordner des Wissenschaftsprojekts geschrieben (nicht in das des Math-Projekts). Wenn Sie also in den bin-Ordner des Wissenschaftsprojekts schauen, sollten Sie die gewebten Klassen dort sehen.

Wenn Sie die In-Pfad-Dateien getrennt von den regulären Dateien behalten möchten, können Sie einen Out-Out-Ordner angeben. Dieser Ordner sollte auch dem Klassenpfad als Binärordner hinzugefügt werden. Außerdem sollte dieser Ordner über der Projektabhängigkeit zu Math-Projekt in der Registerkarte "Export and Order" der Java-Build-Seite für das Science-Projekt platziert werden.

Schließlich, wenn Sie die Hauptklasse von Science-Projekt statt von Math-Projekt ausführen, werden Sie den Webcode ausführen.

+0

Danke für die Antwort. Grundsätzlich haben Sie für mich bestätigt, dass ich in der Lage sein sollte, dies zur Arbeit zu bringen und dass der Weg der richtige Weg war. Seit ich die Frage geschrieben habe, ist mir jetzt ein Fehler aufgefallen, den ich gerade google. Vielleicht ist das das einzige Problem ... Ich werde die Frage mit dem Fehler aktualisieren. – gMale