Java AspectJ模块依赖与Maven-如何使用依赖模块的类型间声明方法

Java AspectJ模块依赖与Maven-如何使用依赖模块的类型间声明方法,java,maven,aop,aspectj,aspectj-maven-plugin,Java,Maven,Aop,Aspectj,Aspectj Maven Plugin,这就是我的处境: 我有一个maven项目我的项目aj依赖关系由两个jar模块组成: my project aj dependencyJarWithAJ(如果我有,请参阅aspectAppWithAj\u ahah.aj中下面的ahah()方法) my project aj DependencyJarWithout aj 我的问题是,我想在第二个模块中使用在第一个模块方面定义的一些声明方法,但可能我遗漏了一些东西。 我的poms配置如下: Maven项目pom(my project aj d

这就是我的处境:

我有一个maven项目
我的项目aj依赖关系
由两个jar模块组成:

  • my project aj dependencyJarWithAJ
    (如果我有,请参阅aspect
    AppWithAj\u ahah.aj
    中下面的
    ahah()
    方法)
  • my project aj DependencyJarWithout aj
我的问题是,我想在第二个模块中使用在第一个模块方面定义的一些声明方法,但可能我遗漏了一些东西。

我的poms配置如下:

Maven项目pom(
my project aj dependency
):

Maven模块2 pom(
my project aj DependencyJarWithout aj
):

AppWithAj_-Ahah.aj
是:

package org.my.project.aj.dependencyJarWithAJ;

public class AppWithAj {
    public static void main( String[] args ){
        System.out.println( "Hello World!" );
    }
}
package org.my.project.aj.dependencyJarWithAJ;

public aspect AppWithAj_Ahah {
    public String AppWithAj.ahah(){
        return "Ahahahah!";
    }
}
package org.my.project.aj.dependencyJarWithoutAJ;
import org.my.project.aj.dependencyJarWithAJ.AppWithAj;

public class App {
    public static void main( String[] args ) {
        System.out.println( "Hello World! " + new AppWithAj().ahah());
    }
}
最后,
App.java
是:

package org.my.project.aj.dependencyJarWithAJ;

public class AppWithAj {
    public static void main( String[] args ){
        System.out.println( "Hello World!" );
    }
}
package org.my.project.aj.dependencyJarWithAJ;

public aspect AppWithAj_Ahah {
    public String AppWithAj.ahah(){
        return "Ahahahah!";
    }
}
package org.my.project.aj.dependencyJarWithoutAJ;
import org.my.project.aj.dependencyJarWithAJ.AppWithAj;

public class App {
    public static void main( String[] args ) {
        System.out.println( "Hello World! " + new AppWithAj().ahah());
    }
}

我用这个pom配置实现了:

项目pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <name>abc</name>
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.madx</groupId>
   <artifactId>abc</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>pom</packaging>
   <modules>
      <module>abc1</module>
      <module>abc2</module>
   </modules>
   <properties>
      <maven.compiler.target>1.7</maven.compiler.target>
      <maven.compiler.source>1.7</maven.compiler.source>
      <aspectj.version>1.8.9</aspectj.version>
   </properties>
   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>com.madx</groupId>
            <artifactId>abc1</artifactId>
            <version>${project.version}</version>
         </dependency>
         <dependency>
            <groupId>com.madx</groupId>
            <artifactId>abc2</artifactId>
            <version>${project.version}</version>
         </dependency>
      </dependencies>
   </dependencyManagement>
   <build>
      <pluginManagement>
         <plugins />
      </pluginManagement>
   </build>
</project>

abc
4.0.0
com.madx

编辑: 似乎如果nonAj项目没有AspectJ特性,它会在.aj定义的方法附近警告您(尽管如果您只是启动它,它工作得很好,但对于eclipse来说,它不是一个错误,顺便说一句,这不允许您使用自动完成ad将代码填充为衰减…)。这是快照:
您的解决方案太复杂了:

  • AspectJ(AJ)模块需要AJ Maven插件和对aspectjrt的依赖。到目前为止,一切顺利
  • 但是声明的方面只影响其自身模块中的类,并通过ITD对其进行扩展。因此,无需在纯Java模块上使用AJ编译器,纯Java模块只调用来自AJ模块的方法。被调用的方法是由ITD创建的,这与此无关,对于另一个模块来说,它看起来就像普通的Java
  • 因此,所有非AJ模块需要的是对AJ模块的正常依赖,因为它使用它的一个类。AJ运行时依赖项是可传递的,应该自动使用
更新:

你要的是POM,给你

根POM:


4.0.0
com.madx
我的项目aj依赖关系
0.0.1-快照
MyProjectAjDependency
聚甲醛
UTF-8
1.7
1.8.9
org.aspectj
aspectjrt
${aspectj.version}
运行时
com.madx
我的项目aj dependencyJarWithAj
${project.version}
com.madx
我的项目aj DependencyJar没有aj
${project.version}
org.apache.maven.plugins
maven编译器插件
3.5.1
${java.source-target.version}
${java.source-target.version}
假的
org.codehaus.mojo
aspectj maven插件
1.8
${java.source-target.version}
${java.source-target.version}
忽视
${java.source-target.version}
${project.build.sourceEncoding}
过程源
编译
测试编译
org.aspectj
aspectjtools
${aspectj.version}
org.codehaus.mojo
execmaven插件
1.4.0
我的项目aj dependencyJarWithAJ
我的项目aj DependencyJar没有aj
带有AspectJ的模块:


4.0.0
com.madx
我的项目aj依赖关系
0.0.1-快照
我的项目aj dependencyJarWithAJ
org.codehaus.mojo
aspectj maven插件
org.aspectj
aspectjrt
普通Java模块:


4.0.0
com.madx
我的项目aj依赖关系
0.0.1-快照
我的项目aj DependencyJar没有aj
org.codehaus.mojo
execmaven插件
org.my.project.aj.dependencyJarWithoutAJ.App
com.madx
我的项目aj dependencyJarWithAj
请注意:我添加了Exec Maven插件只是为了演示,所以您可以这样做:

mvn清洁安装
mvn-pl my project aj DependencyJarWithout aj exec:java
然后您应该在控制台上看到如下内容:

(…)
[信息]---exec maven插件:1.4.0:java(默认cli)@my project aj dependencyJarWithoutAJ---
你好,世界!哈哈哈!

从根目录和普通Java POM中删除Exec Maven,以获得更短的POM。

好的,请在这里粘贴最简单的POM(如下面我的答案所示),以便
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
      <groupId>com.madx</groupId>
      <artifactId>abc</artifactId>
      <version>0.0.1-SNAPSHOT</version>
   </parent>
   <groupId>com.madx</groupId>
   <artifactId>abc1</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>abc1</name>
   <url>http://maven.apache.org</url>
   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
   <dependencies>
      <dependency>
         <groupId>org.aspectj</groupId>
         <artifactId>aspectjrt</artifactId>
         <version>1.8.9</version>
      </dependency>
      <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>3.8.1</version>
         <scope>test</scope>
      </dependency>
   </dependencies>
   <build>
      <plugins>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
               <source>${java-version}</source>
               <target>${java-version}</target>
            </configuration>
         </plugin>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
               <execution>
                  <id>install</id>
                  <phase>install</phase>
                  <goals>
                     <goal>sources</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>
         <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <!--
                    Have to use version 1.2 since version 1.3 does not appear to work
                    with ITDs
                -->
            <version>1.2</version>
            <dependencies>
               <!--
                        You must use Maven 2.0.9 or above or these are ignored (see
                        MNG-2972)
                    -->
               <dependency>
                  <groupId>org.aspectj</groupId>
                  <artifactId>aspectjrt</artifactId>
                  <version>${org.aspectj-version}</version>
               </dependency>
               <dependency>
                  <groupId>org.aspectj</groupId>
                  <artifactId>aspectjtools</artifactId>
                  <version>${org.aspectj-version}</version>
               </dependency>
            </dependencies>
            <executions>
               <execution>
                  <goals>
                     <goal>compile</goal>
                     <goal>test-compile</goal>
                  </goals>
               </execution>
            </executions>
            <configuration>
               <outxml>true</outxml>
               <source>${java-version}</source>
               <target>${java-version}</target>
            </configuration>
         </plugin>
      </plugins>
   </build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
      <groupId>com.madx</groupId>
      <artifactId>abc</artifactId>
      <version>0.0.1-SNAPSHOT</version>
   </parent>
   <groupId>com.madx</groupId>
   <artifactId>abc2</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>abc2</name>
   <url>http://maven.apache.org</url>
   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
   <dependencies>
      <dependency>
         <groupId>com.madx</groupId>
         <artifactId>abc1</artifactId>
         <version>${project.version}</version>
      </dependency>
      <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>3.8.1</version>
         <scope>test</scope>
      </dependency>
   </dependencies>
   <build>
      <plugins>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
               <source>${java-version}</source>
               <target>${java-version}</target>
            </configuration>
         </plugin>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
               <execution>
                  <id>install</id>
                  <phase>install</phase>
                  <goals>
                     <goal>sources</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>
         <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <!--
                        Have to use version 1.2 since version 1.3 does not appear to work
                        with ITDs
                    -->
            <version>1.2</version>
            <dependencies>
               <!--
                            You must use Maven 2.0.9 or above or these are ignored (see
                            MNG-2972)
                        -->
               <dependency>
                  <groupId>org.aspectj</groupId>
                  <artifactId>aspectjrt</artifactId>
                  <version>${org.aspectj-version}</version>
               </dependency>
               <dependency>
                  <groupId>org.aspectj</groupId>
                  <artifactId>aspectjtools</artifactId>
                  <version>${org.aspectj-version}</version>
               </dependency>
            </dependencies>
            <executions>
               <execution>
                  <goals>
                     <goal>compile</goal>
                     <goal>test-compile</goal>
                  </goals>
               </execution>
            </executions>
            <configuration>
               <outxml>true</outxml>
               <source>${java-version}</source>
               <target>${java-version}</target>
            </configuration>
         </plugin>
      </plugins>
   </build>
</project>