当前位置: 首页 > 知识库问答 >
问题:

用户URLClassLoader“即时”加载jar文件

华欣怡
2023-03-14

好的,基本上,我尝试使用这里描述的方法JarFileLoader来加载一个jar,其中包含一个类,该类的使用方式与类路径上的相同(类名将是动态的,因此我们可以添加任何jar任何类和程序将通过解析文本文件加载它,在主线中)。

问题是当我调试和检查URLClassLoader对象

protected Class<?> findClass(final String name)

行:

Resource res = ucp.getResource(path, false);

getResource()在参数中找不到类名。

有人已经尝试过用这种方式加载jar文件了吗?

谢谢。

加载器:

public class JarFileLoader extends URLClassLoader {
    public JarFileLoader() {
        super(new URL[] {});
    }

    public JarFileLoader withFile(String jarFile) {
        return withFile(new File(jarFile));
    }

    public JarFileLoader withFile(File jarFile) {
        try {
            if (jarFile.exists())
                addURL(new URL("file://" + jarFile.getAbsolutePath() + "!/"));
        } catch (MalformedURLException e) {
            throw new IllegalArgumentException(e);
        }
        return this;
    }

    public JarFileLoader withLibDir(String path) {
        Stream.of(new File(path).listFiles(f -> f.getName().endsWith(".jar"))).forEach(this::withFile);
        return this;
    }
}

主要:

public static void main(String[] args) {
    new Initializer();
    JarFileLoader cl = new JarFileLoader();
    cl = cl.withFile(new File("libs/dpr-common.jar"));
    try {
        cl.loadClass("com.*****.atm.dpr.common.util.DPRConfigurationLoader");
        System.out.println("Success!");
    } catch (ClassNotFoundException e) {
        System.out.println("Failed.");
        e.printStackTrace();
    } finally {
        try {
            cl.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这里是我使用的测试类。当我调试URLClassLoader时,我可以在第三个循环中看到jar文件的路径(类路径上的循环和您在这里添加的URL),但仍然找不到ressource(并且无法调试类URLClassPath,因此不知道getRessource到底做了什么)。

共有1个答案

富涛
2023-03-14

好的,我从这个问题中得到答案:如何从一个目录中动态加载所有JAR?

并在开始时改变URL部分,以及在长部分的工作方式。

例如:

String path = "libs/dpr-common.jar";
if (new File(path).exists()) {
    URL myJarFile = new File(path).toURI().toURL();
    URL[] urls = { myJarFile };
    URLClassLoader child = new URLClassLoader(urls);
    Class DPRConfLoad = Class.forName("com.thales.atm.dpr.common.util.DPRConfigurationLoader", true, child);
    Method method = DPRConfLoad.getDeclaredMethod("getInstance");
    final Object dprConf = method.invoke(DPRConfLoad);
}

我所有的时间都浪费在搜索上,而这是一个错误的例子。。。仍然不明白他们为什么使用像“jar:file…”这样愚蠢的URL等

谢谢大家。

 类似资料:
  • 问题内容: 我需要为应用程序的某些部分向现有应用程序添加插件功能。我希望能够在运行时添加jar,并且应用程序应该能够从jar中加载类,而无需重新启动应用程序。到目前为止,一切都很好。我使用URLClassLoader在线找到了一些示例,并且运行良好。 我还希望能够在罐子的更新版本可用时重新加载相同的类。我再次发现了一些示例,据我所知,实现此目标的关键是我需要为每个新负载使用一个新的类加载器实例。

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

  • 我有一个应用程序,它在根文件夹的lib文件夹中加载一个jar文件,当我把这个根文件夹放在C:\或C:\someFolder中时,它工作得很好,但当我把它放在“程序文件(x86)”中时,它返回了FileNotFoundException,即使在管理模式下已经存在并正在运行cmd。 我得到System.out.println来调试信息并返回正确的路径。 从应用程序中使用println的Stacktra

  • 我正在用JSE编程,我正在用另一个java程序加载一个jar。我想问题出在java虚拟机的类加载器上。我说过,因为我尝试用java-jar“file.jar”执行文件jar,它就运行了。我将xubuntu与Eclipse一起使用。在eclipse中,我有两个项目,分别是加载jar的第一个软件和jar软件。要导出jar文件,我使用向导“export->jar ecc....”我该如何解决这个问题?

  • 问题内容: 我被要求构建一个Java系统,该系统在运行时能够加载新代码(扩展)。我的代码运行时如何重新加载jar文件?或如何加载新的jar? 显然,由于持续的正常运行时间很重要,因此,我想增加在此过程中重新加载现有类的功能(如果这样做不会使事情复杂化)。 我应该注意什么?(将其视为两个不同的问题-一个关于在运行时重新加载类,另一个关于添加新类)。 问题答案: 用现有数据重新加载现有类可能会破坏事情

  • 问题内容: 我有一个签名的小程序。为了实现某些插件体系结构,我下载了具有特定类的JAR文件并将其存储到磁盘中。 然后我用加载这些类。因此,现在我尝试从已加载的类中调用某些方法,并且遇到了安全问题。 加载类be时似乎无法检查“符号令牌” 。有人知道如何解决这个问题吗? 非常感谢! 正在加载。 调用。 例外。 问题答案: 安装一个自定义的安全管理器,该安全管理器允许来自正确的代码库(程序包等)的代码执