Chinaxing Chinaxing -3 years ago 75
Java Question

how to specify class path for java agent

I am write a Java Agent to instrument a target Method of a target Class.

I use the javassist library to do instrument.

so the java agent (let named CnAgent.class) need its dependency : javassist library to run.

the directory hierarchy is :

.
├── META-INF
│   └── MANIFEST.MF
├── com
│   └── yet
│   └── another
│   └── test
│   └── agent
│   ├── CnAgent.class
│   └── CnTransformer.class
└── lib
└── javassist-3.18.2-GA.jar


and the MANIFEST.MF file content is :

Manifest-Version: 1.0
Class-Path: lib/javassist-3.18.2-GA.jar .
Agent-Class: com.yet.another.test.agent.CnAgent
Created-By: 1.8.0_11 (Oracle Corporation)
Can-Retransform-Classes: true


I create jar ball by following command:

jar cvfm CnAgent.jar META-INF/MENIFIEST.MF . lib


when I load the Agent with Attach API of JVM.
the error prints :

error when transform : javassist/ClassPool
java.lang.NoClassDefFoundError: javassist/ClassPool


which means the javassist library cannot be found by agent code.

so my question is :


  1. how to set Agent library's class path letting it found the dependencies ?

  2. why the Class-Path option in MANIFEST.MF not works , does it only for jar directly ran in command line ?



thanks your wisdom :)

Answer Source

You can use the option -Xbootclasspath: (sets the path) or -Xbootclasspath/a: (appends the given path to the existing boot class path) (refer to doc from oracle). But, as described in the link, it is non-standard.

As an alternative, you can copy the missing jar file in the %JAVA_HOME%/jre/lib/ext directory.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download