2010-09-09 5 views
6

Esto debería ser simple.AspectJ: Cómo obtener puntos para asesorar a las clases ubicadas en otros proyectos

Pregunta
¿Cómo se obtiene un punto de corte en un proyecto para asesorar al código/clases dentro de otro proyecto?


Contexto
Estoy trabajando en eclipse con dos proyectos. Para facilitar la explicación, vamos a llamar a uno proyecto de ciencias y el otro proyecto de matemáticas y dicen que el proyecto de la ciencia se basa en el proyecto de matemáticas y estoy desarrollando en ambos proyectos, al mismo tiempo. El proyecto de matemáticas es un producto central, en producción, y la vida será más fácil si no modifico mucho el código.

Actualmente, estoy depurando la interacción entre estos dos proyectos. Para ayudar con eso, estoy escribiendo un Aspecto (dentro del proyecto de ciencias) para registrar información clave a medida que se ejecuta el código de matemáticas (y el código de ciencias).


Ejemplo
I funcionamiento de un aspecto simple ejemplo a lo largo de las líneas de:

package org.science.example; 

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


Problema
El problema es, no importa qué punto de corte se crea, sólo se aconseja código del proyecto de ciencia . Ninguna clase de org.math.example tiene corte transversal, ¡EN ABSOLUTO!

He intentado añadir el proyecto matemáticas a la INPATH del proyecto ciencia yendo a proect properties > AspectJ Build > Inpath y haciendo clic proyecto de complemento y elegir el proyecto matemáticas. Eso no funcionó, pero parece que tengo que hacer algo en ese sentido.

Gracias, por adelantado, para cualquier sugerencia ...

-gMale


EDIT 1:
Después de haber escrito esto, me he dado cuenta de que el proyecto está dando el siguiente error:

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

Así que quizás esto esté configurado correctamente y el error sea más sutil. Por cierto, la clase mencionada es del "proyecto de ciencia", por así decirlo. Esto sucede incluso después de limpiar el proyecto. Actualmente estoy buscando en Google este error ...


EDIT 2:
he encontrado la solución para el error anterior en comment #5 here

El problema es el archivo POM de Maven-aspectj-plugin declara una dependencia de la versión 1.6 aspectjtools .7. Entonces, al configurar el plugin, esa dependencia transitoria tiene que ser modificada. Aquí está el fragmento de código relacionado para el archivo pom que soluciona el problema especificando la versión 1.6.9 en lugar de 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> 

Respuesta

4

Su segundo problema no está relacionado con el primero. Se dice que com.our.project.adapter.GenericMessagingAdapter se compiló originalmente y se tejió con una nueva versión de AspectJ, pero se está utilizando para enlazar binarios con una versión anterior de AspectJ.

Esto es esencialmente el mismo problema que cuando intenta ejecutar clases de Java compiladas en 1.6 en una máquina virtual de 1.5.

El número de versión fue acelerado para el lanzamiento de AspectJ 1.6.8 (creo, o tal vez fue 1.6.7).

La solución es asegurarse de que está utilizando la última versión de AspectJ para todos sus proyectos (por ejemplo, 1.6.9 o compilaciones dev de 1.6.10).

+0

Gracias, tienes razón. Acabo de resolver la excepción y actualicé mi pregunta anterior, en consecuencia. Desafortunadamente, por el bien del tiempo, esencialmente me han ordenado que inserte el "proyecto matemático" directamente en el "proyecto científico". Claramente, esto evita el problema, pero no puedo determinar el impacto de corregir el segundo error porque la base del código es completamente diferente ahora y retroceder en la subversión tomaría demasiado tiempo. Gracias por tu ayuda. Como usted es la única respuesta, votaré todos sus mensajes y le recompensaré la respuesta. ¡Gracias! – gMale

2

Cuando se agrega el proyecto de Matemáticas en la ruta de proyecto de la ciencia, todo el código del proyecto matemáticas se envía a través de la tejedora aspectj y debidamente tejida. Los resultados de ese tejido se escriben en la carpeta de salida del proyecto de ciencia (no en el proyecto de Matemáticas). Entonces, si miraras en la carpeta bin del proyecto de ciencias, deberías ver las clases tejidas allí.

Si desea mantener los archivos de ruta in separados de los archivos normales, puede especificar una carpeta inpath out. Esta carpeta también se debe agregar a la ruta de clase como una carpeta binaria. Además, esta carpeta debe colocarse encima de la dependencia del proyecto Math en la pestaña "Exportar y ordenar" de la página de compilación de Java para el proyecto Science.

Finalmente, si ejecuta la clase principal desde el proyecto Science, en lugar de desde el proyecto Math, estará ejecutando el código entrelazado.

+0

Gracias por la respuesta. Básicamente, me confirmaste que debería poder hacer que esto funcione y que el camino correcto era el correcto. Desde que escribí la pregunta, ahora noté un error de que actualmente estoy buscando en Google. Quizás ese es el único problema ... Actualizaré la pregunta con el error. – gMale

Cuestiones relacionadas