当前位置: 首页 > 面试题库 >

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

越福
2023-03-14
问题内容

我需要为应用程序的某些部分向现有应用程序添加插件功能。我希望能够在运行时添加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个解决方法



 类似资料:
  • 好的,基本上,我尝试使用这里描述的方法JarFileLoader来加载一个jar,其中包含一个类,该类的使用方式与类路径上的相同(类名将是动态的,因此我们可以添加任何jar任何类和程序将通过解析文本文件加载它,在主线中)。 问题是当我调试和检查URLClassLoader对象时 行: getResource()在参数中找不到类名。 有人已经尝试过用这种方式加载jar文件了吗? 谢谢。 加载器: 主

  • 我正在尝试热重新加载Lua模块,但在我的情况下,标准方法似乎不起作用。 我创建了两个简单的示例模块“app.lua”和“test.lua”,其中前一个模块作为应用程序的入口点: 并从后者加载一个函数: 此应用程序在docker容器中运行,该容器构建自Tarantool官方图像。假设我对“test”模块的代码进行了更改,比如,将带有print的行更改为“print(“?”)。重新加载模块的标准方法是

  • 问题内容: 我在玩反射,我想做点东西来加载一个类并打印该类中所有字段的名称。我制作了一个小型的hello world类型的类来检查一些东西: 基于以上所述,我得出两个结论: 它存在于/home/kent/eclipsews/SmallExample/bin/IndependentClass.class 有用!(因此它必须是可以由类加载器加载的正确的.class文件) 然后使用反射的代码:(标记导致

  • 我正在创建一个Spring Boot应用程序,由于业务原因,我需要导入一个第三方jar,该jar还从名为application.properties的文件中读取一些配置参数。 我已经在spring boot application.properties文件中定义了应用程序和第三方jar所需的所有配置。 例外情况:

  • 我用python scrapy编写了一个脚本,从一个网站下载一些图片。当我运行我的脚本时,我可以在控制台中看到图像的链接(它们都是格式)。然而,当我打开下载完成时应该保存图像的文件夹时,我什么也没有看到。我犯错的地方? 这是我的蜘蛛(我正在从Sublime文本编辑器运行): 这是我在中为要保存的图像定义的内容: 为了让事情更清楚: 我希望保存图像的文件夹名为,我已将其放在项目下的文件夹中。 文件夹

  • 我试图用TheNewBoston的教程制作一个蛇游戏,因为我是一名中学生,在Python方面没有太多经验。代码是: 但是,当我执行、播放、丢失并按C重试时,会出现此错误。当我想退出时,Q可以正常工作,但C只是退出,并打印此错误: C:\Python34\python。exe“C:/Users/Ded/PycharmProjects/PyGame/PyGame Tutorial.py”回溯(上次调用