java - ¿Cómo puedo hacer que AspectJ load weaving trabaje en Gradle(específicamente las compilaciones libgdx)
(1)
No voy a proporcionar una implementación de gradle, sino una de Maven, usando AspectJ. Obviamente, tendrá que personalizar / adaptar para adaptarse a sus necesidades. A continuación, un aspecto en un método bar.foo
tomando dos parámetros (String, Boolean)
con un consejo @Around
y un ProceedingJoinPoint
. Cualquier consejo o Pointcut puede ser implementado obviamente.
JAVA
@Aspect
@ajcPrivileged
public class MyAspect {
@Pointcut("execution(* bar.foo(String, Boolean)) && args(string, bool)")
void foo(String string, Boolean bool) {}
@Around(value = "loadFile(filePathName, toGray)", argNames = "filePathName, toGray")
public MyReturnType foo(final ProceedingJoinPoint joinPoint, final String string, final Boolean bool) throws MyEx {
//impl
}
}
POM
Consulte Weave the third party dependency comment para definir la lib de terceros que desea tejer.
<project ..>
..
<properties>
<aspectj-maven-plugin.version>1.7</aspectj-maven-plugin.version>
<aspectjrt.version>1.8.2</aspectjrt.version>
..
</properties>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectjrt.version}</version>
</dependency>
..
</dependencies>
<build>
..
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>${aspectj-maven-plugin.version}</version>
<configuration>
<complianceLevel>${java.version}</complianceLevel>
<source>${java.version}</source>
<target>${java.version}</target>
<!-- Weave third party dependency -->
<weaveDependencies>
<weaveDependency>
<groupId>yourThirdPartyDepGroupId</groupId>
<artifactId>yourThirdPartyDepGroupIdArtifactId</artifactId>
</weaveDependency>
</weaveDependencies>
</configuration>
<!-- Weave on compile -->
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<!--This plugin''s configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>${lifecycle-mapping.version}</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<versionRange>[1.7,)</versionRange>
<goals>
<goal>compile</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore></ignore>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
Así que quiero inyectar algunas funciones de prueba y registro en mi juego libgdx.
Así que agregué lo siguiente a mi las principales dependencias de escritorio de Gradle.
compile ''org.aspectj:aspectjweaver:1.8.2''
compile "org.aspectj:aspectjrt:1.8.2"
Inicialmente no encontraba las dependencias, pero eso se solucionó apagando el modo fuera de línea y cerrando y volviendo a abrir mi proyecto IntelliJ (el botón de sincronización de Gradle no funcionaba).
Tengo entendido que el aspectjweaver debe cargarse como un agente de Java. Así que encontré donde parece que gradle lo descargó y agregó lo siguiente a mis opciones de configuración de tiempo de ejecución de VM
-javaagent:/Users/daniel/.gradle/caches/modules-2/files-2.1/org.aspectj/aspectjweaver/1.8.2/4963c0bef4748d5ad039cc26c1ac32a082eb755e/aspectjweaver-1.8.2.jar
Sorprendentemente, esto me da el siguiente mensaje de advertencia
objc[66447]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/bin/java and /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined.
Ese mensaje está ausente sin la línea -javaagent.
Estaba intentando seguir este ejemplo para un ejemplo de tejido de carga. http://andrewclement.blogspot.co.uk/2009/02/load-time-weaving-basics.html
Sin embargo, no necesito un aspecto reutilizable por separado, así que acabo de crear un archivo básico aop.xml en el directorio src con los siguientes contenidos.
<aspectj>
<weaver options="-verbose"/>
</aspectj>
Obviamente, todavía no tengo nada configurado, solo quiero confirmar que la configuración está funcionando. Hay suficientes diferencias entre ese tutorial y mi entorno objetivo que imagino que muchas cosas pueden salir mal.
Realmente no me importa si la solución es el tiempo de compilación o la carga de clases, siempre que funcione de manera predecible en el entorno libgdx / gradle. Opté por buscar en la solución de carga de clases debido a mi falta de familiaridad con los requisitos y el entorno de construcción de libgdx / gradle.
Gracias por adelantado.
Actualización : Trataré de abrirme camino a través de este http://www.breskeby.com/2010/02/using-gradle-with-aspectj/
... pero no estoy familiarizado con iajc en el tutorial, y saber cómo usar esto en los scripts de compilación libgdx también parece complejo.