我确定这相当于AspectJ的新手问题,但审查书籍和网站,我没有看到我认识到的答案。
摘要:在我的客户端Jar中,我收到编译错误,抱怨说作为“Aspect B”的一部分添加的方法不存在。
我的设置类似于:
+---------------------+
| |
| Client Jar |
| |
+--+---------------+--+
| |
| |
+----------+----+ +-------v-------+
| JSON Serial / | | Other Aspect |
| Deser Aspect | +---------------+
+-------------+-+ +-------v-------+
| | Potential |
| | Other Jar |
| +---------------+
|
+----v-----------+
| Javabean |
| Aspects |
+----------------+
+----v-----------+
| Basic Data |
| Objects |
+----------------+
基本上,我有两个层面的方面,其中每个层都在扩展行为。
假设“基本数据对象”中的以下类:
BasicDataObjects SampleObject
public class SampleObject {
private String name;
private int age;
}
以及JavaBean Aspects中的以下方面:
privileged aspect SampleObject_JavaBean {
public String SampleObject.getName() {
return this.name;
}
}
JSON方面的以下方面:
privileged aspect SampleObject_Json {
public String SampleObject.getNameValue() {
return this.name == null ? null : this.name.serialize();
}
}
最后,在实际的客户端jar中,我得到以下内容作为编译错误:
public void someMethod (SampleObject obj) {
obj.getNameValue() // <-- This has a compilation error that the getNameValue() is unresolvable.
}
在我的客户端Jar中,我收到编译错误,因为“Aspect B”中添加的方法不可用。
我的期望是“Aspect A”生成的jar文件应该编译所有自己的类以及作为“Aspect B”的一部分提供的所有类。
看点B pom:
<project>
<!-- (...) -->
<artifactId>aspect-b</artifactId>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>lib-data-objects</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<configuration>
<outxml>true</outxml>
<complianceLevel>${java.version}</complianceLevel>
<source>${java.version}</source>
<target>${java.version}</target>
<weaveDependencies>
<weaveDependency>
<groupId>com.example</groupId>
<artifactId>lib-data-objects</artifactId>
</weaveDependency>
</weaveDependencies>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
</configuration>
</plugin>
</plugins>
</build>
<!-- (...) -->
</project>
看点A pom:
<project>
<!-- (...) -->
<artifactId>aspect-a</artifactId>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>lib-data-objects</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>aspect-b</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<configuration>
<outxml>true</outxml>
<complianceLevel>${java.version}</complianceLevel>
<source>${java.version}</source>
<target>${java.version}</target>
<weaveDependencies>
<weaveDependency>
<groupId>com.example</groupId>
<artifactId>aspect-b</artifactId>
</weaveDependency>
</weaveDependencies>
</configuration>
</plugin>
</plugins>
</build>
<!-- (...) -->
</project>
客户端Jar pom:
<project>
<!-- (...) -->
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>aspect-a-wrapper</artifactId>
<version>${aspect-a.version}</version>
</dependency>
<groupId>com.example</groupId>
<artifactId>lib-data-objects</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<configuration>
<outxml>true</outxml>
<complianceLevel>${java.version}</complianceLevel>
<source>${java.version}</source>
<target>${java.version}</target>
<weaveDependencies>
<weaveDependency>
<groupId>com.example</groupId>
<artifactId>aspect-a</artifactId>
</weaveDependency>
</weaveDependencies>
</configuration>
</plugin>
</plugins>
</build>
<!-- (...) -->
</project>
答案 0 :(得分:0)
我发现,由于我对这个主题的相对新颖性以及项目的一般复杂性,我有两个问题最终成为了“失踪儿童”的根本原因&#34;:
我使用weaveDependencies和aspectLibraries感到困惑
它很简单,但我发现我想:
Use weave dependencies to weave existing libraries into a new aspect-based project
和
Use aspect libraries to weave existing aspects into a new project
不要为&#34; plain&#34;设置依赖关系。基础jar的版本(例如基本数据对象)以及将jar编织到项目中的方面。 (注意&#34; Client Jar&#34; pom我调出了方面和原始java jar文件。)
如果我在使用键盘之前搞大脑就足够了。