我有一个程序需要在运行时动态加载JAR - 经过搜索,我认为这需要使用URLClassLoader,但我不确定如何让它工作。 JAR文件“openup.jar”与程序位于同一目录中。
理想情况下,我希望能够加载此JAR,而无需指定其中每个单独的类。
理想情况下,我希望能够加载此JAR,而无需指定其中每个单独的类。
我成功使用的:
@SuppressWarnings("unchecked")
public void addURL(URL u) throws IOException {
URLClassLoader sysLoader = (URLClassLoader) ThisClass.class.getClassLoader();
URL urls[] = sysLoader.getURLs();
for (int i = 0; i < urls.length; i++) {
if (urls[i].toString().equalsIgnoreCase(u.toString())) {
return;
}
}
Class sysclass = URLClassLoader.class;
try {
Method method = sysclass.getDeclaredMethod("addURL", parameters);
method.setAccessible(true);
method.invoke(sysLoader, new Object[] { u });
} catch (Throwable t) {
throw new IOException("Error, could not add URL to system classloader");
}
}
一个几乎相同的解决方案确实在如何在运行时动态加载Jars?中提出。
ThisClass
的类加载器是 URLClassLoader
;2)URLClassLoader
类有一个 addURL
方法(它所做的正是你想要的);3)你可以调用 setAccessible()
(即没有运行安全管理器并禁止该操作)。 - Joachim Sauer在这里,我将解释创建jar文件的完整流程,并动态加载到另一个项目中:
创建jar的步骤:
包newJar.com.example;
public class MyClass {
public MyClass() {
// TODO Auto-generated constructor stub
}
public void helloWorld() {
System.out.println("Hello from the helloWorld");
}
}
动态加载jar的步骤:
创建一个新项目并添加以下代码:
public class CustomClass {
public CustomClass() { // TODO 自动生成的构造函数存根 }
public void getCall(File myJar) {
try {
URLClassLoader loader = new URLClassLoader(new URL[] { myJar.toURI().toURL() },
CustomClass.class.getClass().getClassLoader());
Class classToLoad = Class.forName("newJar.com.example.MyClass", true, loader);
System.out.println(classToLoad);
Method method = classToLoad.getDeclaredMethod("helloWorld");
Object instance = classToLoad.newInstance();
Object result = method.invoke(instance);
} catch (MalformedURLException | ClassNotFoundException | NoSuchMethodException | SecurityException
| InstantiationException | IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
public static void main(String[] args) { // TODO 自动生成的方法存根
File myJar = new File("你的jar包路径");//"D:\\ECLIPSE\\myjar.jar"
CustomClass cls = new CustomClass();
cls.getCall(myJar);
}
}
这是如何利用jar文件的方法,如果jar文件在服务器上,则可以使用服务器路径而不是本地路径。