6

これは単純なはずです。

質問
あるプロジェクトでポイントカットを取得して、別のプロジェクト内のコード/クラスにアドバイスするにはどうすればよいですか?


コンテキスト
私は 2 つのプロジェクトで日食に取り組んでいます。説明を簡単にするために、1 つの科学プロジェクトともう 1 つの数学プロジェクトを呼び出し、科学プロジェクトは数学プロジェクトに依存しており、両方のプロジェクトで同時に開発を行っているとします。数学プロジェクトは本番環境のコア製品であり、コードをあまり変更しなければ生活は楽になります。

現在、これら 2 つのプロジェクト間の相互作用をデバッグしています。これを支援するために、数学コード (および科学コード) の実行時に重要な情報をログに記録する Aspect (科学プロジェクト内) を作成しています。



次の行に沿って単純なサンプル アスペクトを実行します。

package org.science.example;

public aspect ScientificLog {
    public pointcut testCut() : execution (public * *.*(..));
    before() : testCut() {
        //do stuff
    }
}


問題問題は、私が作成したポイントカットに関係なく、科学プロジェクト
のコードしかアドバイスしないことです。からのクラスはクロスカットではありません。add projectに移動してクリックし、数学プロジェクトを選択して、数学プロジェクトを科学プロジェクトinpathに追加してみました。それはうまくいきませんでしたが、それらの線に沿って何かをする必要があるようです.org.math.example

proect properties > AspectJ Build > Inpath

事前に、ご提案いただきありがとうございます...

-g男性


編集1:
これを書いて以来、プロジェクトが次のエラーを出していることに気付きました:

原因: org.aspectj.weaver.BCException: 続行できません。このバージョンの AspectJ
は、weaver バージョン 6.0 で構築されたクラスをサポートしますが、クラス
com.our.project.adapter.GenericMessagingAdapter はバージョン 7.0 です
一括ビルド時 BuildConfig[null] #Files=52 AopXmls=#0

したがって、これは適切に設定されている可能性があり、エラーはより微妙です。ところで、言及されたクラスは、いわば「科学プロジェクト」からのものです。これは、プロジェクトをクリーンアップした後でも発生します。私は現在、このエラーをグーグルで調べています...


編集 2:コメント #5 で
上記のエラーの解決策を見つけました 。

問題は、maven-aspectj-plugin の pom ファイルが、aspectjtools バージョン 1.6.7 への依存関係を宣言していることです。そのため、プラグインを構成するときに、その一時的な依存関係を変更する必要があります。1.6.7 ではなくバージョン 1.6.9 を指定して問題を修正する pom ファイルの関連コード スニペットを次に示します。

                    <plugin>
                            <groupId>org.codehaus.mojo</groupId>
                            <artifactId>aspectj-maven-plugin</artifactId>
                            <version>1.3</version>
                            <dependencies>
                                <dependency>
                                    <groupId>org.aspectj</groupId>
                                    <artifactId>aspectjtools</artifactId>
                                    <version>1.6.9</version>
                                </dependency>
                            </dependencies>
                            <configuration>
                                    <source>1.6</source>
                                    <target>1.6</target>
                            </configuration>
                            <executions>
                                    <execution>
                                            <goals>
                                                    <goal>compile</goal>
                                                    <goal>test-compile</goal>
                                            </goals>
                                    </execution>
                            </executions>
                    </plugin>
4

2 に答える 2

5

2 番目の問題は、最初の問題とは無関係です。com.our.project.adapter.GenericMessagingAdapter は、もともと AspectJ の新しいバージョンに対してコンパイルおよび織り込まれていましたが、古いバージョンの AspectJ に対してバイナリ織りに使用されていると言っています。

これは基本的に、1.6 でコンパイルされた Java クラスを 1.5 VM で実行しようとした場合と同じ問題です。

AspectJ 1.6.8 のリリースに合わせてバージョン番号が更新されました (1.6.7 だったと思います)。

解決策は、すべてのプロジェクトで最新バージョンの AspectJ を使用していることを確認することです (例: 1.6.9、または 1.6.10 の開発ビルド)。

于 2010-09-10T21:06:55.223 に答える
2

数学プロジェクトを科学プロジェクトのパスに追加すると、数学プロジェクトのすべてのコードがアスペクト ウィーバーを介して送信され、適切に織り込まれます。その織りの結果は、(数学プロジェクトではなく) 科学プロジェクトの出力フォルダーに書き込まれます。したがって、科学プロジェクトの bin フォルダーを調べると、そこに織り込まれたクラスが表示されるはずです。

in パス ファイルを通常のファイルとは別に保持したい場合は、inpath out フォルダーを指定できます。このフォルダーも、バイナリー・フォルダーとしてクラスパスに追加する必要があります。また、このフォルダーは、Science プロジェクトの Java ビルド ページの [エクスポートと注文] タブで、Math プロジェクトへのプロジェクト依存関係の上に配置する必要があります。

最後に、Math プロジェクトからではなく Science プロジェクトからメイン クラスを実行すると、織り込まれたコードが実行されます。

于 2010-09-09T19:39:48.487 に答える