0

アスペクトを使用したいがスプリングを使用したくないプロジェクトがあります。だから私はAspectJを使用しています。私の特定のシナリオでは、LTW は機能しないため、CTW を使用する必要があります。これにより、Maven のspectj プラグインにたどり着きます。現在、Java 7 を使用しています。ある Maven モジュールで記述されたアスペクトを、それを依存関係として持つ別のモジュールに織り込んでいます。

プラグインは、注釈のないアスペクトを織り込んでいるときに正しく織り込まれているように見えますが、注釈ベースのアスペクトに切り替えると、実行時にプラグインが hasaspect() メソッドとアスペクトオブ() メソッドに書き込んでいないように見えます。メソッドが存在しないという例外が発生します。

私が試したことの 1 つは、メソッドを見つけることができるようになることを期待して、アノテーション ベースのアスペクトで Aspects クラスを拡張することでしたが、これもうまくいきませんでした。

私のプラグインは次のように構成されています:

   <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.4</version>
            <configuration>
                <showWeaveInfo>false</showWeaveInfo>
                <Xlint>ignore</Xlint>
                <source>1.7</source>
                <target>1.7</target>
                <complianceLevel>1.7</complianceLevel>
                <encoding>UTF-8</encoding>
                <verbose>false</verbose>
                <weaveDirectories>
                    <weaveDirectory>${project.build.outputDirectory}</weaveDirectory>
                </weaveDirectories>
                <aspectLibraries>
                    <aspectLibrary>
                        <groupId>my.group</groupId>
                        <artifactId>dependencywithaspecttoweave</artifactId>
                    </aspectLibrary>
                </aspectLibraries>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjtools</artifactId>
                    <version>1.7.2</version>
                </dependency>
            </dependencies>

私の注釈付きの側面は次のようになります。

public class TraceLog extends Aspects {
private ComponentLogger logger;

@Pointcut(value = "within(my.package..*) && "
        + "execution(* *(..))")
public void scope() {
}

/**
 * Before method.
 *
 * @param thisJoinPoint The joinpoint.
 * @throws IllegalAccessException When it tries to get the logger and can't.
 */
@Before(value = "scope()")
public void logBefore(final JoinPoint thisJoinPoint) throws IllegalAccessException {
    logMethod(thisJoinPoint, "Entering " + createLogMessage(thisJoinPoint));
}
...

私がしなければならなかったことは、昔ながらの注釈なしのアスペクト スタイルに戻すことです。しかし、メソッドから例外をスローできないため、これは面倒です (または、少なくとも今のところ、方法がわかりません)。例外のスローは、ユーザーがアクセス権を持っていない場合、呼び出し元に警告する適切な方法であるセキュリティなどの場合に特に役立ちます。

前もって感謝します。

4

1 に答える 1

0

私はほぼ同じ設定で動作し (Spring から離れ、Google App Engine はコンパイル時のウィービングのみをサポートしています)、マルチモジュール EAR をデプロイしています。

あなたの質問から、AspectJ マルチモジュールのドキュメントが見つからず、セットアップでそれを使用していないようです。あなたのPOMをより詳しく見ると、あなたの実行セクションにはテストコンパイルフェーズのためのものがないことがわかります。また、できるだけ多くの情報を取得する必要があります。verbose と showWeaveInfo を true に設定します。これにより、Google により良いエラーが返される (そして、おそらく StackOverflow に指摘される) か、助けを求める必要があります。

私の実行セクションは次のとおりです

      <!-- Executions for compiler -->
      <executions>
        <execution>
          <id>aspectj-compile</id>
          <goals>
            <goal>compile</goal>
          </goals>
        </execution>
        <execution>
          <id>aspectj-test-compile</id>
          <goals>
            <goal>test-compile</goal>
          </goals>
        </execution>
      </executions>

より多くの情報を取得し、テストをコンパイルして、プロジェクトを推奨どおりにセットアップするまでの間に、作業を開始できるはずです。

于 2013-12-09T19:52:02.803 に答える