在方面使用来自其他模块的对象

时间:2016-04-19 22:19:31

标签: java maven aspectj

我有一个方面使用aspectJ如下:

final int LINES, WORDS;
String[] metaData = new String[LINES = 5 * (WORDS = 3)]; // I don't like it

int i = 0;
while ((metaLine = metaRead.readLine()) != null) {
    for (String s : metaLine.split("[ ]+")) metaData[i++] = s;
}

这方面是在模块方面。这个模块打包为jar。 PersistenceManagerImpl 在其他模块中,但我需要在模块方面使用它。对于依赖管理我使用maven。但这里当然是循环引用的问题。存在一些方法如何解决这个问题?

---------- ---------- EDIT

我只得到这个错误:

public aspect TestAspect {

    pointcut classicPointcut(PersistenceManagerImpl object) : execution(manager.PersistenceManagerImpl.new(..)) && target(object);

    after(PersistenceManagerImpl object) : classicPointcut(object){
        System.err.println(object.getClass().getSimpleName());
    }
}

当我将我的方面移动到同一个模块时,PersistenceManagerImpl何时获得正确的解决方案(当然)。但这不是我想要的。

2 个答案:

答案 0 :(得分:0)

你能把编译代码的错误结果?您可以先尝试将另一个模块作为依赖项,然后将依赖项放在pom.xml中weaveDependency的aspectj maven插件中,如下所示:

....
<dependency>
            <groupId>com.maventest</groupId>
            <artifactId>mytest</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
....

....
<plugin>                                                           
    <groupId>org.codehaus.mojo</groupId>                           
    <artifactId>aspectj-maven-plugin</artifactId>                  
    <version>1.8</version>                                         
    <executions>                                                   
        <execution>                                                
            <goals>                                                
                <goal>compile</goal>                               
            </goals>                                               
         </execution>                                               
     </executions>                                                  
    <configuration>                                                
         <source>${maven.compiler.source}</source>                  
         <target>${maven.compiler.target}</target>                  
         <showWeaveInfo>true</showWeaveInfo>                        
        <complianceLevel>${maven.compiler.target}</complianceLevel>
        <encoding>${project.build.sourceEncoding}</encoding>       
         <weaveDependencies>                                        
             <weaveDependency>                                      
                <groupId>com.maventest</groupId>
                <artifactId>mytest</artifactId>                 
             </weaveDependency>                                     
         </weaveDependencies>                                       
     </configuration>                                               
     <dependencies>                                                 
         <dependency>                                               
             <groupId>org.aspectj</groupId>                         
             <artifactId>aspectjrt</artifactId>                     
             <version>${aspectj.version}</version>                  
         </dependency>                                              
        <dependency>                                               
            <groupId>org.aspectj</groupId>                         
             <artifactId>aspectjtools</artifactId>                  
             <version>${aspectj.version}</version>                  
         </dependency>                                              
     </dependencies>                                                
</plugin> 

ps:你可以看到我的问题帖子问同样的事情here

答案 1 :(得分:0)

您的方面似乎特定于PersistenceManagerImpl所在的模块,因此该模块应该是方面模块的依赖项。另一方面,该模块依赖于aspect模块,因为它需要它作为AspectJ Maven配置中的<aspectLibrary>。确实是循环依赖,但却是不必要的依赖。您有两种选择:

  • 将方面移动到特定的应用程序模块,因为IMO属于那里,如果它明确使用那里的特定类。只有以适用于多个模块的方式实现横切关注点的方面应该在他们自己的方面库中。
  • 按照之前的想法,您可以使您的方面更加通用,例如:做这样的事情:
public aspect TestAspect {
    pointcut classicPointcut(Object object) :
        execution(*..PersistenceManagerImpl.new(..)) &&
        target(object);

    after(Object object) : classicPointcut(object){
        System.err.println(object.getClass().getSimpleName());
    }
}