java 中的方面未正确编织
Aspect in java not being weaved correctly
我有以下方法:
public class MonitorInterface {
// this is the method you have to call to trigger the monitor
public static void event(String eventName, HashMap params) {
System.out.println("Entering event method");
}
}
以及以下方面:
package aspects;
import com.path.for.MonitorInterface;
import java.util.HashMap;
public aspect _asp_connector0 {
private pointcut eventP():
execution(public static void event(String, HashMap));
before(): eventP(){
System.out.println("Test pointcut weave");
}
}
这基本上是在之前的方法
上添加了一个 Sys.out.print
至于pom.xml我主要使用以下插件:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<useIncrementalCompilation>false</useIncrementalCompilation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<complianceLevel>1.7</complianceLevel>
<Xlint>ignore</Xlint>
<encoding>UTF-8</encoding>
<verbose>true</verbose>
<showWeaveInfo>true</showWeaveInfo>
<sources>
<source>
<basedir>src/main/resources</basedir>
<includes>
<include>**/_asp_connector0.aj</include>
</includes>
<excludes>
<exclude>**/*.java</exclude>
<exclude>**/*.lrv</exclude>
<exclude>**/*.txt</exclude>
</excludes>
</source>
</sources>
</configuration>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<mainClass>path.to.main.Example</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>org.dstovall</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.4.4</version>
<executions>
<execution>
<configuration>
<onejarVersion>0.96</onejarVersion>
<mainClass>path.to.main.Example</mainClass>
<attachToBuild>true</attachToBuild>
</configuration>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
然而,当我编译(使用 mvn clean install)和 运行 生成的 jar 文件时,我从来没有得到所需方法中的编织代码。
或者,我尝试使用 ajc 编译器手动 运行 它们,如下所示:
ajc -outjar testMain.jar -target 1.5 -source 1.5 src\main\java\path\to\Example.java src\main\java\path\to\MonitorInterface.java
set CLASSPATH=%CLASSPATH%;.\testMain.jar
ajc -outjar testAsp.jar -target 1.5 -source 1.5 src\main\resources\aspects\_asp_connector0.aj
set CLASSPATH=%CLASSPATH%;.\testAsp.jar
aj path.to.Example
这会导致警告
_asp_connector0.aj:12 [warning] advice defined in aspects._asp_connector0 has not been applied [Xlint:adviceDidNotMatch]
但是新的println还是没有出现
我该如何解决这个问题,或者至少更有效地调试它?
注意:使用maven,正在生成方面的class文件,只是代码没有被编织到实际方法中
由于您的方面在 Eclipse 中的普通 java AspectJ 项目中工作 - 至少对我而言 - 问题一定是你的编织配置。一件事立即突出:
<basedir>src/main/resources</basedir>
为什么要尝试将方面应用于资源而不是代码(src/main/java 作为 Maven 项目的默认设置)?更改该行并删除 includes/excludes,我从 aspectj-maven-plugin 中得到以下内容:
[INFO] Join point 'method-execution(void program.MonitorInterface.event(java.lang.String, java.util.HashMap))' in Type 'program.MonitorInterface' (MonitorInterface.java:7) advised by before advice from 'aspects._asp_connector0' (_asp_connector0.aj:11)
所以建议被采纳和应用。
您是否有理由指定这些特定的 includes/excludes?
<exclude>**/*.java</exclude>
仅此一项就几乎不可能为任何 Java 代码提供建议,因为您从编译时编织中排除了所有 Java 代码。我建议删除所有 includes/excludes 并仅逐个添加它们 IFF 你有一个可以通过 includes/excludes 解决的特定问题。对于您在此处描述的用例,它们完全没有必要,并且在当前配置中实际上存在问题。
我有以下方法:
public class MonitorInterface {
// this is the method you have to call to trigger the monitor
public static void event(String eventName, HashMap params) {
System.out.println("Entering event method");
}
}
以及以下方面:
package aspects;
import com.path.for.MonitorInterface;
import java.util.HashMap;
public aspect _asp_connector0 {
private pointcut eventP():
execution(public static void event(String, HashMap));
before(): eventP(){
System.out.println("Test pointcut weave");
}
}
这基本上是在之前的方法
上添加了一个 Sys.out.print至于pom.xml我主要使用以下插件:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<useIncrementalCompilation>false</useIncrementalCompilation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<complianceLevel>1.7</complianceLevel>
<Xlint>ignore</Xlint>
<encoding>UTF-8</encoding>
<verbose>true</verbose>
<showWeaveInfo>true</showWeaveInfo>
<sources>
<source>
<basedir>src/main/resources</basedir>
<includes>
<include>**/_asp_connector0.aj</include>
</includes>
<excludes>
<exclude>**/*.java</exclude>
<exclude>**/*.lrv</exclude>
<exclude>**/*.txt</exclude>
</excludes>
</source>
</sources>
</configuration>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<mainClass>path.to.main.Example</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>org.dstovall</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.4.4</version>
<executions>
<execution>
<configuration>
<onejarVersion>0.96</onejarVersion>
<mainClass>path.to.main.Example</mainClass>
<attachToBuild>true</attachToBuild>
</configuration>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
然而,当我编译(使用 mvn clean install)和 运行 生成的 jar 文件时,我从来没有得到所需方法中的编织代码。
或者,我尝试使用 ajc 编译器手动 运行 它们,如下所示:
ajc -outjar testMain.jar -target 1.5 -source 1.5 src\main\java\path\to\Example.java src\main\java\path\to\MonitorInterface.java
set CLASSPATH=%CLASSPATH%;.\testMain.jar
ajc -outjar testAsp.jar -target 1.5 -source 1.5 src\main\resources\aspects\_asp_connector0.aj
set CLASSPATH=%CLASSPATH%;.\testAsp.jar
aj path.to.Example
这会导致警告
_asp_connector0.aj:12 [warning] advice defined in aspects._asp_connector0 has not been applied [Xlint:adviceDidNotMatch]
但是新的println还是没有出现
我该如何解决这个问题,或者至少更有效地调试它?
注意:使用maven,正在生成方面的class文件,只是代码没有被编织到实际方法中
由于您的方面在 Eclipse 中的普通 java AspectJ 项目中工作 - 至少对我而言 - 问题一定是你的编织配置。一件事立即突出:
<basedir>src/main/resources</basedir>
为什么要尝试将方面应用于资源而不是代码(src/main/java 作为 Maven 项目的默认设置)?更改该行并删除 includes/excludes,我从 aspectj-maven-plugin 中得到以下内容:
[INFO] Join point 'method-execution(void program.MonitorInterface.event(java.lang.String, java.util.HashMap))' in Type 'program.MonitorInterface' (MonitorInterface.java:7) advised by before advice from 'aspects._asp_connector0' (_asp_connector0.aj:11)
所以建议被采纳和应用。
您是否有理由指定这些特定的 includes/excludes?
<exclude>**/*.java</exclude>
仅此一项就几乎不可能为任何 Java 代码提供建议,因为您从编译时编织中排除了所有 Java 代码。我建议删除所有 includes/excludes 并仅逐个添加它们 IFF 你有一个可以通过 includes/excludes 解决的特定问题。对于您在此处描述的用例,它们完全没有必要,并且在当前配置中实际上存在问题。