0

intellij で perf4j アノテーションを有効にしようとしていますが、AspectJ を正しく構成するのに苦労しています。より具体的には、ログ ファイルは正しく作成されますが、注釈付きのメソッドからのデータが不足しています。

これらは、関連する構成の抜粋です。

logback.xml

<configuration debug="true">

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
        <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
</appender>

<appender name="statistics" class="ch.qos.logback.core.FileAppender">
    <file>./target/statisticsLogback.log</file>
    <append>false</append>
    <layout>
        <pattern>%msg%n</pattern>
    </layout>
</appender>

<appender name="coalescingStatistics" class="org.perf4j.logback.AsyncCoalescingStatisticsAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <timeSlice>1000</timeSlice>
    <appender-ref ref="statistics"/>
</appender>

<appender name="listAppender" class="ch.qos.logback.core.read.ListAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <timeSlice>1000</timeSlice>
</appender>

<logger name="org.perf4j.TimingLogger" level="info">
    <appender-ref ref="coalescingStatistics" />
    <appender-ref ref="listAppender"/>
</logger>

<root level="debug">
    <appender-ref ref="STDOUT" />
</root>

aop.xml

<?xml version="1.0" encoding="UTF-8"?>
<aspectj>
    <!--
     We only want to weave in the log4j TimingAspect into the @Profiled classes.
     Note that Perf4J provides TimingAspects for the most popular Java logging
     frameworks and facades: log4j, java.util.logging, Apache Commons Logging
     and SLF4J. The TimingAspect you specify here will depend on which logging
     framework you wish to use in your code.
    -->
    <aspects>
        <aspect name="org.perf4j.slf4j.aop.TimingAspect"/>
        <!-- if SLF4J/logback use org.perf4j.slf4j.aop.TimingAspect instead -->
    </aspects>
    <weaver options="-verbose -showWeaveInfo">
        <!--
         Here is where we specify the classes to be woven. You can specify package
         names like com.company.project.*
        -->
        <include within="com.mycode.myproject.mypackage.*"/>
        <include within="org.perf4j.slf4j.aop.*"/>
    </weaver>
</aspectj>

最後に、関連するテスト メソッドが @Profiled アノテーションでタグ付けされます。これは、aop.xml で定義されたパッケージの一部です。

この構成により、ログ ファイルが生成されます (これは、logback.xml が正しく構成されていることを示唆していますが、ヘッダーのみが含まれており、タグ付けされたメソッドからの統計は含まれていません。

私が持っている主な質問は、Intellij 内で AspectJ 構成をどこに置くべきかということです。src フォルダーに手動で作成された META-INF フォルダーの下に aop.xml を含めましたが、これが AspectJ によってまったく検出されるかどうかはわかりません。

前もって感謝します

アップデート

最初の投稿以来、これに関していくらかの進歩を遂げました。具体的には 2 つの変更を導入しました。aop 構成は、構成の詳細をログに記録し、プロファイリングされているメソッドについても言及しているため、現在ピックアップされています。問題は、プロファイリングされているスレッドがクラッシュすることです。例外はログに記録されませんが、デバッグを介して、org.aspectj.runtime をインスタンス化しようとすると、org.aspectj.runtime.reflect.Factory の ClassNotFoundException に関連しているように見えます。 Reflect.JoinPointImpl.

問題を特定するために、aspectJ の Maven インポートをすべて削除し、インストール パッケージによって提供される jar を使用しましたが、問題は解決しません。また、アプリケーションがログなしでクラッシュするという事実により、問題の追跡が難しくなります。

アップデート

明確にするために:

  • ウェイバックリンクのマニュアルを含め、これについて詳しく読んだ後(ありがとう)、ロード時/コンパイル時のアプローチを混同していることに気付きました。それ以来、ガイドに記載されているように両方の方法を試しましたが、以前の更新で説明したのと同じ結果になりました。
  • 上記のように、aspectj ウィーバー オプション (-javaagent) を使用してアプリケーションを起動します。
  • 上記のように、ビルドはIDE経由で行われます。現時点では、Mavenからaspectj / perf4jの依存関係を削除し、ローカルjarにリンクしています
  • 前述のように、aop.xml は更新で述べたように取得され、エラーや警告はなく、織り方の確認のみが行われます
4

1 に答える 1

1

よし、完全な Maven の例をGitHub リポジトリに追加しました。これを複製して、いじってみましょう。

考慮すべきいくつかの基本的な事項:

  • コンパイル時ウィービング (CTW) の場合aspectjrt.jar、コードをコンパイルして実行するときにクラスパスが必要です。また、AspectJ コンパイラを使用してプロジェクトをビルドする必要があります。通常の Java コンパイラでは十分ではありません。
  • ロードタイム ウィービング (LTW) の場合aspectjweaver.jar、コードを実行するときにコマンド ラインで Java エージェントとして必要です: -javaagent:/path/to/aspectjweaver.jar. また、これを VM 引数として IDEA の LTW 実行構成に追加する必要があります。
  • LTW の場合META-INF/aop.xmlは、リソース フォルダーにも必要です。また、サブパッケージを含めるには、 だけで..*なく表記を使用する必要があることにも注意してください。.*<include within="de.scrum_master..*"/>

詳細については、私のプロジェクトの read-me ファイルを参照してください。

PS: Perf4J のドキュメントは古く、プロジェクトはメンテナンスされていません。したがって、必要な依存関係として AspectJ 1.6.x について言及しています。最新の AspectJ 1.8.10 ですべてをビルドして実行しましたが、Maven と IDEA の両方から問題なく動作します。

于 2017-04-14T10:00:58.343 に答える