1

単純な側面を持つ単純なプロジェクト (hello world) を実行しようとしました。Maven を使用してこのプロジェクトをビルドし、アスペクトには LTW、ログには logback を使用します。私が使用すると、アスペクトが織り込まれます:

"C:\Program Files\Java\jdk1.6.0_22\bin\java"
  -javaagent:.\libs\aspectjweaver-1.7.3.jar
  -cp ".\libs\ProtoApp-v0.0.1-SNAPSHOT.jar;.\libs\*"
  -Xms64m -Xmx512m -XX:MaxPermSize=128m
  -Daj.weaving.verbose=true
  -Dorg.aspectj.weaver.showWeaveInfo=true
  -Dlogback.configurationFile=file:.\logback.xml
org.iiter.continuum.protos.simple.App

しかし、JMX のパラメーターを追加すると、アスペクトは織り込まれなくなります。

"C:\Program Files\Java\jdk1.6.0_22\bin\java"
  -javaagent:.\libs\aspectjweaver-1.7.3.jar
  -cp ".\libs\ProtoApp-v0.0.1-SNAPSHOT.jar;.\libs\*"
  -Xms64m -Xmx512m -XX:MaxPermSize=128m
  -Daj.weaving.verbose=true
  -Dorg.aspectj.weaver.showWeaveInfo=true
  -Dcom.sun.management.jmxremote
  -Dcom.sun.management.jmxremote.port=7777
  -Dcom.sun.management.jmxremote.authenticate=false
  -Dcom.sun.management.jmxremote.ssl=false
  -Dlogback.configurationFile=file:.\logback.xml
org.iiter.continuum.protos.simple.App

あなたの誰かが私を助けることができるなら、私は何が起こっているのか理解できません。

追加した JMX リモートのオプションは次のとおりです。

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=7777
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

注意: OSGI アプリ (equinox) を試してみたところ、JMX のこのパラメーターで問題なく動作しましたが、通常の Java アプリケーションが本当に必要です。

編集 1

クラスローダーを検査するために Java エージェントを追加しました。

JMX リモートをアクティブにすると、クラスローダー階層は次のようになります (containsConfiguration は、Aspectj 構成が java.lang.ClassLoader.getResource(String) によって検出されることを意味します):

- root
  - AdaptorKey [sysHashCode=1672527304, loaderClass=javax.management.remote.rmi.NoCallStackClassLoader, containsConfiguration=false, hasParent=false]
  - AdaptorKey [sysHashCode=1040288884, loaderClass=sun.reflect.DelegatingClassLoader, containsConfiguration=false, hasParent=false]
  - AdaptorKey [sysHashCode=239625678, loaderClass=sun.reflect.DelegatingClassLoader, containsConfiguration=false, hasParent=false]
  - AdaptorKey [sysHashCode=1818873899, loaderClass=javax.management.remote.rmi.NoCallStackClassLoader, containsConfiguration=false, hasParent=false]
  - AdaptorKey [sysHashCode=527532737, loaderClass=sun.misc.Launcher$ExtClassLoader, containsConfiguration=false, hasParent=false]
    - AdaptorKey [sysHashCode=132787710, loaderClass=sun.misc.Launcher$AppClassLoader, containsConfiguration=true, hasParent=true]
  - AdaptorKey [sysHashCode=426901684, loaderClass=sun.reflect.DelegatingClassLoader, containsConfiguration=false, hasParent=false]

JMX リモートがアクティブ化されていない場合、クラスローダーの階層は次のようになります。

- root
  - AdaptorKey [sysHashCode=527532737, loaderClass=sun.misc.Launcher$ExtClassLoader, containsConfiguration=false, hasParent=false]
    - AdaptorKey [sysHashCode=132787710, loaderClass=sun.misc.Launcher$AppClassLoader, containsConfiguration=true, hasParent=true]

この結果で…私はまだ何が起こっているのか理解できません。構成はエージェントによって検出されますが、Aspectj では検出されません…

ログを見ると、AspectJ は javax.management.remote.rmi.NoCallStackClassLoader 以外のクラスローダを登録していません。

なんで?

4

1 に答える 1

1

最終的に解決策を見つけました。「<strong>-Xbootclasspath/p:libs/aspectjweaver-1.7.3.jar;libs/aspectjrt-1.7.3.jar」をコマンド ラインに追加する必要があります。

このオプションを使用すると、すべてが正常に機能します。

完全なコマンド ラインは次のとおりです。

java
    -javaagent:.\libs\aspectjweaver-1.7.3.jar 
    -Xbootclasspath/p:libs/aspectjweaver-1.7.3.jar;libs/aspectjrt-1.7.3.jar 
    -cp ".\libs\ProtoApp-v0.0.1-SNAPSHOT.jar;.\libs\*" 
    -Xms64m -Xmx512m -XX:MaxPermSize=128m 
    -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=7777 
    -Dcom.sun.management.jmxremote.authenticate=false 
    -Dcom.sun.management.jmxremote.ssl=false 
    -Daj.weaving.verbose=true -Dorg.aspectj.weaver.showWeaveInfo=true 
    -Dlogback.configurationFile=file:.\logback.xml 
    org.iiter.continuum.protos.simple.App

アンディ・クレメントの助けに感謝

トゥグデュアル

于 2013-08-01T12:15:00.043 に答える