简体   繁体   中英

Using javaagent with javassist in WildFly

I've written a simple javaagent that basically injects some logging in classes that are part of the JDK, such as javax/imageio/spi/ServiceRegistry , using javassist .

It works fine in a simple standalone application, but I cannot get it to work in WildFly 10. What I have tried:

  • Added the agent JAR as a module to WildFly along with the corresponding module.xml which declares <module name="org.javassist"/> as dependency
  • Appended the agent package and org.javassist to JBOSS_MODULES_SYSTEM_PKGS
  • Appended -javaagent:/full/path/to/agent/jar/in/module to JAVA_OPTS

WildFly starts but in server.log I get:

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)

It seems the module class loader is used but even though the agent module has a dependency to org.javassist , it still cannot load its classes.

What am I missing?

Eventually I got it to work by adding only the package of the agent to JBOSS_MODULES_SYSTEM_PKGS (not "javassist") and adding the org.javassist module JAR to the boot classpath:

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

Now the agent works, it can load the Javassist classes. Certainly not the clean way but it is just for debugging purposes...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM