AspectJ LTW无法使用JMX远程

时间:2013-07-22 10:13:37

标签: java aspectj jmx

我尝试用简单的方面做一个简单的项目(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 remote时,类加载器层次结构是(containsConfiguration意味着java.lang.ClassLoader.getResource(String)找到了Aspectj配置):

- 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。

为什么?

1 个答案:

答案 0 :(得分:1)

我终于找到了一个解决方案:我需要在命令行中添加“ -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

感谢Andy Clement的帮助

Tugdual