我正在使用URLClassLoader加載類。URLClassLoader無法加載Linux上的依賴關係
雖然我傳遞的文件的名稱已成功加載,但對於它所反對的類,則會引發NoClassDefFoundError。這兩個類都是不同的jar文件的一部分。
更奇怪的東西是相同的一段代碼在Windows上工作正常,但它在Linux上拋出錯誤。
這裏是我使用的代碼:
package com.pb.spectrum.lim.upgrade.common;
import java.io.File;
import java.io.FilenameFilter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
public class ClassInvoker {
public static void main(String[] args) throws MalformedURLException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
if(args.length < 2){
throw new IllegalArgumentException("First argument should be Class name. Second argument should be jar's directory. Rest of the arguments passed to main method of invoked class.");
}
File jarsDir = new File(args[1]);
if(!jarsDir.isDirectory()){
throw new IllegalArgumentException("Second argument should point to jar's directory.");
}
URLClassLoader urlClassLoader = null;
List<URL> urls = new ArrayList<URL>();
File[] files = jarsDir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".jar");
}
});
for(File jarFile : files){
urls.add(jarFile.toURI().toURL());
}
urlClassLoader = new URLClassLoader(urls.toArray(new URL[urls.size()]));
Thread.currentThread().setContextClassLoader(urlClassLoader);
Object[] params = new String[args.length-2];
// First 2 arguments are not required for class to be invoked.
System.arraycopy(args, 2, params, 0, params.length);
for(Object string : params){
System.out.println("Param ---->" + (String)string);
}
Class clazz = urlClassLoader.loadClass(args[0]);
Method method = clazz.getMethod("main", new Class[]{String[].class});
method.invoke(null, new Object[] {params});
}
}
現在,如果我通過爲A.B.MyClass1它成功地加載到加載類,但它未能加載A.B.MyClass2這是在單獨的jar文件。
當你System.out.println'urls'時你會得到什麼? – 2013-03-05 13:39:21
@NarendraPathai我沒有使用classpath,我正在使用URLClassLoader – 2013-03-05 13:46:37
@DumumRanatunga打印網址給出了預期的結果。所有我添加的jar文件都顯示在那裏。 – 2013-03-05 13:47:26