在WildFly中使用javaagent和javassist

时间:2018-02-19 14:24:22

标签: java wildfly agent

我编写了一个简单的javaagent,它基本上使用javax/imageio/spi/ServiceRegistry在JDK的一些类中注入一些日志记录,例如javassist

它在一个简单的独立应用程序中运行良好,但我无法在WildFly 10中使用它。我尝试过:

  • 将代理JAR作为模块添加到WildFly,并将相应的module.xml声明为<module name="org.javassist"/>作为依赖
  • 将代理程序包和org.javassist附加到JBOSS_MODULES_SYSTEM_PKGS
  • 附加-javaagent:/full/path/to/agent/jar/in/moduleJAVA_OPTS

WildFly启动但在server.log中我得到:

java.lang.NoClassDefFoundError: javassist/ClassPool
      at net.luniks.agent.LoggerChanger.transform(LoggerChanger.java:48)
      at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
      at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
      at java.lang.ClassLoader.findBootstrapClass(Native Method)
      at java.lang.ClassLoader.findBootstrapClassOrNull(ClassLoader.java:1015)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:413)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
      at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
      at java.lang.Class.forName0(Native Method)
      at java.lang.Class.forName(Class.java:348)
      at org.jboss.modules.ClassLoaderLocalLoader.loadClassLocal(ClassLoaderLocalLoader.java:74)
      at org.jboss.modules.Module.loadModuleClass(Module.java:606)
      at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190)

似乎使用了模块类加载器,但即使代理模块依赖于org.javassist,它仍然无法加载其类。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

最终我通过将代理程序包添加到JBOSS_MODULES_SYSTEM_PKGS(而不是&#34; javassist&#34;)并将org.javassist模块JAR添加到引导类路径来实现它:< / p>

JAVA_OPTS="$JAVA_OPTS -Xbootclasspath/p:/path/to/wildfly/modules/system/layers/base/org/javassist/main/javassist-3.18.1-GA.jar"

现在代理可以工作,它可以加载Javassist类。当然不是干净的方式,但它仅用于调试目的......