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 回答