我想啓動一個java子進程,它具有與當前java進程相同的java classpath和動態加載的類。以下是不夠的,因爲它不包含任何動態加載的類:使用父進程啓動Java子進程類路徑
String classpath = System.getProperty("java.class.path");
目前我在尋找與下面的代碼所需要的每個類。但是,在某些機器上,某些類/庫會失敗,源變量爲空。是否有更可靠和更簡單的方法來獲取當前jvm進程使用的庫的位置?
String stax = ClassFinder.classPath("javax.xml.stream.Location");
public static String classPath(String qualifiedClassName) throws NotFoundException {
try {
Class qc = Class.forName(qualifiedClassName);
CodeSource source = qc.getProtectionDomain().getCodeSource();
if (source != null) {
URL location = source.getLocation();
String f = location.getPath();
f = URLDecoder.decode(f, "UTF-8"); // decode URL to avoid spaces being replaced by %20
return f.substring(1);
} else {
throw new ClassFinder().new NotFoundException(qualifiedClassName+" (unknown source, likely rt.jar)");
}
} catch (Exception e) {
throw new ClassFinder().new NotFoundException(qualifiedClassName);
}
}
出於好奇:你是怎麼想出這種方法的? – 2010-01-12 16:24:55
我是怎麼想出這種方法的?我發現它在網上的某個地方,不記得現在在哪裏。 我認爲這個問題真的歸結爲,爲什麼ProtectionDomain .getCodeSource()有時返回null。 APIs文檔沒有用,他們只是說該方法可能會返回null。 – 2010-01-12 17:15:40