Search code examples
javajvmjvm-hotspot

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 find 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 :)


Solution

  • 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.