Mavenプロジェクトにアスペクトを適用する際に問題があります。おそらく何かが足りないので、手順のリストを作成しました。正しいかどうか確認してください。
projectA
はアスペクトクラスであり、projectB
クラスはアスペクトによって変更する必要があるとしましょう。
ProjectA
クラスでMavenプロジェクトAspectJ
を作成しますAspectj
プラグインと依存関係を追加しますProjectA
pom.xml
への依存関係としてprojectB
を追加しますprojectB
pom.xml
プラグインに追加<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<aspectLibraries>
<aspectLibrary>
<groupId>ProjectA</groupId>
<artifactId>ProjectA</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
</plugin>
これらすべての手順の後、私の問題は、コンパイル中に次のようになることです:
[WARNING] advice defined in AspectE has not been applied [Xlint:adviceDidNotMatch]
そして、プログラムを実行すると:
Exception in thread "FeatureExcutionThread" Java.lang.NoClassDefFoundError: AspectE
あなたが実際に何をしようとしているのかを見つけるために、古い質問のいくつかをたどりました。私は次の構造とコードを考え出しましたが、私にとってはうまくいきます。
$ツリー。 。 ├──pom.xml ├──ProjectA | ├──pom.xml | └──src | └──main | └──アスペクト | └──com | └──stackoverflow | └──アスペクト | ├──AspectL.Java | └──Trace.aj └──ProjectB ├──pom.xml └──src └──main └ ──Java └──com └──stackoverflow └──App.Java
pom.xml
<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>
<groupId>org.stackoverflow</groupId>
<artifactId>Q12423965</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>${project.artifactId}-${project.version}</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target>
</properties>
<modules>
<module>ProjectA</module>
<module>ProjectB</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.stackoverflow</groupId>
<artifactId>Q12423965-ProjectA</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
</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>
</pluginManagement>
</build>
</project>
ProjectA/pom.xml
<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>org.stackoverflow</groupId>
<artifactId>Q12423965</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>Q12423965-ProjectA</artifactId>
<name>${project.artifactId}-${project.version}</name>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2つの異なる側面を作成しました。 @AspectJアノテーションを使用するものと、古典的なAspectJアスペクトとして定義されているもう1つ。
AspectL.Java
package com.stackoverflow.aspects;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
/**
* @author maba, 2012-09-18
*/
@Aspect
public class AspectL {
@Pointcut("execution(* main(..))")
public void defineEntryPoint() {
}
@Before("defineEntryPoint()")
public void aaa(JoinPoint joinPoint) {
System.out.println("aspect before");
}
@After("defineEntryPoint()")
public void bbb(JoinPoint joinPoint) {
System.out.println("aspect after");
}
}
Trace.aj
package com.stackoverflow.aspects;
public aspect Trace {
pointcut publicMethodExecuted(): execution(public !static * *(..));
after(): publicMethodExecuted() {
System.out.printf("Enters on method: %s. \n", thisJoinPoint.getSignature());
Object[] arguments = thisJoinPoint.getArgs();
for (int i =0; i < arguments.length; i++){
Object argument = arguments[i];
if (argument != null){
System.out.printf("With argument of type %s and value %s. \n", argument.getClass().toString(), argument);
}
}
System.out.printf("Exits method: %s. \n", thisJoinPoint.getSignature());
}
}
これらの2つのファイルはProjectAモジュールの一部であり、jarの一部です。
次に、これらの側面を使用して、ProjectBのコードに織り込みます。
ProjectB/pom.xml
<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>org.stackoverflow</groupId>
<artifactId>Q12423965</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>Q12423965-ProjectB</artifactId>
<name>${project.artifactId}-${project.version}</name>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>org.stackoverflow</groupId>
<artifactId>Q12423965-ProjectA</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<configuration>
<aspectLibraries>
<aspectLibrary>
<groupId>org.stackoverflow</groupId>
<artifactId>Q12423965-ProjectA</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<goals>
<goal>Java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>com.stackoverflow.App</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
App.Java
package com.stackoverflow;
/**
* @author maba, 2012-09-17
*/
public class App {
public void hello(String name) {
}
public static void main(String[] args) {
App app = new App();
app.hello("world");
}
}
トップポンポンからすべてを構築します。
mvn clean install
次に、ProjectBディレクトリに移動してアプリを実行します。
mvn exec:Java
結果は次のとおりです。
aspect before
Enters on method: void com.stackoverflow.App.hello(String).
With argument of type class Java.lang.String and value world.
Exits method: void com.stackoverflow.App.hello(String).
aspect after
したがって、両方の側面が機能していると結論付けて、Mavenセットアップも機能します。
これは私にとってはうまくいきました。外部依存関係の検索を追加する必要がありました(weaveDependenciesを参照)それらに織りを実行するには、ProjectA pomファイルにこれを含める必要があります:
<dependencies>
<dependency>
<groupId>com.ProjectB</groupId>
<artifactId>ProjectB</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal><!-- to weave all your main classes -->
<goal>test-compile</goal><!-- to weave all your test classes -->
</goals>
</execution>
</executions>
<configuration>
<weaveDependencies>
<weaveDependency>
<groupId>com.ProjectB</groupId>
<artifactId>ProjectB</artifactId>
</weaveDependency>
</weaveDependencies>
<showWeaveInfo>true</showWeaveInfo>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
</configuration>
</plugin>
</plugins>
</build>
それが役に立てば幸い...
私もこの問題を抱えていたことを覚えていますが、Javaアノテーションベースの側面に切り替えて解決しました。試してみてください。
私はあなたと同じ問題を抱えていました。私が見つけた唯一の解決策は、AspectJプロジェクト内の各アスペクトクラスのラッパーを作成して、外部プロジェクトがそれにアクセスできるようにすることでした