使用URLClassLoader重新加载jar时出现问题

我需要为应用程序的某些部分向现有应用程序添加插件功能。我希望能够在运行时添加jar,并且应用程序应该能够从jar中加载类,而无需重新启动应用程序。到目前为止,一切都很好。我使用URLClassLoader在线找到了一些示例,并且运行良好。

我还希望能够在罐子的更新版本可用时重新加载相同的类。我再次发现了一些示例,据我所知,实现此目标的关键是我需要为每个新负载使用一个新的类加载器实例。

我编写了一些示例代码,但遇到了NullPointerException。首先,让我向大家展示代码:

package test.misc;

import java.io.File;

import java.net.URL;

import java.net.URLClassLoader;

import plugin.misc.IPlugin;

public class TestJarLoading {

public static void main(String[] args) {

IPlugin plugin = null;

while(true) {

try {

File file = new File("C:\\plugins\\test.jar");

String classToLoad = "jartest.TestPlugin";

URL jarUrl = new URL("jar", "","file:" + file.getAbsolutePath()+"!/");

URLClassLoader cl = new URLClassLoader(new URL[] {jarUrl}, TestJarLoading.class.getClassLoader());

Class loadedClass = cl.loadClass(classToLoad);

plugin = (IPlugin) loadedClass.newInstance();

plugin.doProc();

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

Thread.sleep(30000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

}

IPlugin是一个简单的接口,只有一个方法doProc:

public interface IPlugin {

void doProc();

}

jartest.TestPlugin是此接口的实现,其中doProc只是打印一些语句。

现在,我将jartest.TestPlugin类打包到一个名为test.jar的jar中,并将其放在C:\

plugins下并运行此代码。第一次迭代运行平稳,并且类加载没有问题。

当程序执行sleep语句时,我将C:\ plugins \

test.jar替换为包含相同类的更新版本的新jar,并等待一段时间的下一次迭代。现在,这就是我不明白的地方。有时,更新后的类会重新加载而没有问题,例如,下一次迭代运行良好。但是有时候,我会看到一个异常:

java.lang.NullPointerException

at java.io.FilterInputStream.close(FilterInputStream.java:155)

at sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream.close(JarURLConnection.java:90)

at sun.misc.Resource.getBytes(Resource.java:137)

at java.net.URLClassLoader.defineClass(URLClassLoader.java:256)

at java.net.URLClassLoader.access$000(URLClassLoader.java:56)

at java.net.URLClassLoader$1.run(URLClassLoader.java:195)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

at java.lang.ClassLoader.loadClass(ClassLoader.java:252)

at test.misc.TestJarLoading.main(TestJarLoading.java:22)

我已经在网上搜索并挠了挠头,但不能真正得出关于为什么抛出该异常的结论,也不能得出任何结论-仅在某些时候,并非总是如此。

我需要您的经验和专业知识来理解这一点。此代码有什么问题?请帮忙!!

让我知道您是否需要更多信息。感谢您的光临!

回答:

此行为与jvm中的错误有关。此处

记录了 2个解决方法

以上是 使用URLClassLoader重新加载jar时出现问题 的全部内容, 来源链接: utcz.com/qa/427857.html

回到顶部