tags:

views:

336

answers:

4

Suppose there is a jar file named callme.jar

and it's located in several directories,

how to analyse which one of them is used at run-time?

+1  A: 

Might not be the easiest method, but you could look at what files the process has open and determine it from that.

If you're on windows you could use Process Explorer to see what files the process has open at any given time, or Process Monitor to watch the filesystem access as it runs. There will be a lot of noise, but you could figure it out from there.

If you're on the Mac I think the built-in Activity Monitor can give you a list of open files. Sadly I don't know the command you'd use in Linux.

Herms
lsof -p PID - will list files open for a particular process in linux
Cogsy
+10  A: 

Invoke the java executable with the -verbose:class argument. This will produce output like:

[Loaded org.apache.log4j.helpers.ThreadLocalMap from file:/C:/.../1.2.14/log4j-1.2.14.jar]
[Loaded org.apache.commons.cli.Option from file:/C:/.../commons-cli-1.2.jar]

matt b
If that outputs for every single class it loads, you might want to pipe it to grep: java -verbose:class ... | grep 'callme.jar'; Should cut down on the noise
Herms
A: 

Try this piece of code :

 //Get the System Classloader
 ClassLoader sysClassLoader = ClassLoader.getSystemClassLoader();

 //Get the URLs
 URL[] urls = ((URLClassLoader)sysClassLoader).getURLs();
 System.out.println("CURRENT CLASSPATH :");
 for(int i=0; i< urls.length; i++){
  System.out.println(urls[i].getFile());
 }       
 System.out.println("END OF CLASSPATH");
g andrieu
+1  A: 
System.getProperty("java.class.path");
rich
This answer is deceptively correct - because the JVM (or at least Sun's?) will load the class from the first location on the classpath that contains it; in the order of the classpath
matt b
This would only work if you have control over the code. That might be the case here, but I'm not sure.
Herms