8

次の方法で (Perf4J でプロファイリングを行うために) ロード時のウィービングを構成しようとしました。

1)フォルダに追加aop.xmlしました。META-INFデプロイされると、META-INF はアーティファクト ルート ディレクトリ (つまりMyAppDeployed/META-INF) に配置されます。

2) 、 、 をフォルダに入れaspectjrt-1.6.1.jarましaspectjweaver-1.6.1.jarcommons-jexl-1.1.jar(commons-logging.jar最初Tomcat/libに試しMyAppDeployed/WEB-INF/libsましたが、これも機能しませんでした)。

3) -javaagent:C:\apache-tomcat-6.0.33\lib\aspectjweaver-1.6.1.jarTomcat の起動時に VM オプションを追加しました。

4) 私aop.xml:

<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">

<aspectj>

    <aspects>
        <aspect name="org.perf4j.log4j.aop.TimingAspect"/>
    </aspects>

    <weaver options="-verbose -showWeaveInfo">           
        <include within="com.mypackages.MyClass"/>
    </weaver>
</aspectj>

読み込み時の織り込みが発生する兆候は見られません。エラー報告も必要な結果もありません。私が持っている唯一のエラーメッセージは次のとおりです。

Error occurred during initialization of VM
agent library failed to init: instrument
Error opening zip file: C:\apache-tomcat-6.0.33\lib\wrong-jar.jar

aspectjweaver-1.6.1.jarjavaagent パラメータを指定する際に名前を間違えた場合。正しく記述されていれば、エラー メッセージは表示されません。

アイデアはありますか、何が間違っていますか?

PS私はJava 5を使用しています1.5.4.aspectjのバージョンで同じことを試してみましたが、まったく同じ結果が得られました.

4

2 に答える 2

5

ロードタイム ウィービングを使用する場合は、最初に通常どおりjavacを使用してクラスをコンパイルし、次に(i)ajcを使用してアスペクトをコンパイルします。以下のようなantタスクでこれを行うことができます

<target name="compile-aspect">
    <iajc source="1.6" target="1.6" showweaveinfo="true" verbose="true" outxml="true" debug="true" outjar="${dist.dir}/myaspect.jar">
            <argfiles>
                    <pathelement location="${src.dir}/sources.lst"/>
            </argfiles>
            <classpath>
                    <path refid="master-classpath" />
            </classpath>
    </iajc>
</target>

コンパイル時に、クラスパス ( "master-classpath" ) にspectjrt.jarがあれば十分です。

私の Java クラスはすべて${src.dir}にあるので、ソース リストを iajc に渡します。ソース リストには 1 行しかありません。

ソース.lst

com/xx/yy/zz/LoggingAspect.java

Iajcタスクの属性のいくつかを次のように設定しました

outxml="true"
outjar="jar_file_name"

コンパイルアスペクトタスクを実行すると、jar jar_file_name.jarファイルが含まれています

META-INF/MANIFEST.MF
com/xx/yy/zz/LoggingAspect.class
META-INF/aop-ajc.xml

最後に、*jar_file_name.jar* を Web アプリケーションのWEB-INF/libフォルダーに追加します。

次に、前と同じように-javaagents:/path_to_aspectjweaver.jarを使用して Tomcat を起動します。

aop.xml (または aop-ajc.xml) を META-INF に直接 war ファイルの下に配置すると、機能しません。この方法 (つまり、アスペクト クラスを jar に分離すること) は、私にとっては問題なく機能します。

お役に立てれば。

于 2012-09-30T22:39:36.050 に答える
4

Tomcatで同じ問題を解決しようとしていました。-javaagent オプションに加えて、aop.xml が WEB-INF/classes/META-INF ディレクトリの下にあることを確認する必要があります。これが私に違いをもたらしました。

于 2014-11-12T23:15:42.190 に答える