単純な側面を持つ単純なプロジェクト (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 以外のクラスローダを登録していません。
なんで?