gpt4 book ai didi

Java Classloader 无法加载模块?

转载 作者:行者123 更新时间:2023-11-30 09:36:15 27 4
gpt4 key购买 nike

我似乎在为我正在开发的应用程序的模块加载器中加载类时遇到问题。基本上,我将用它加载的所有类都扩展了另一个类,该类位于实际应用程序的包中。出于我们的目的,我们将其称为模块。模块位于实际应用程序之外的单独文件夹中。

加载程序遍历文件夹并对任何扩展名为 .class 的文件执行 loadFile() 方法。所有类都有作为 Module 类的包声明,以及类头中的 extends Module 声明。

这是 loadFile() 方法,排除了 header 和异常子句:

String fileName = file.getName();
String className = fileName.replace(".class", ""); //Strips extension
Class<?> aClass = Class.forName(className, true, new URLClassLoader(new URL[] { file.toURI().toURL() }));
Class<? extends Module> modClass = aClass.asSubclass(Module.class);
return modClass.getConstructor().newInstance();

我一直在第三行收到 ClassNotFoundException。然后,如果没有抛出 ClassNotFoundException,是否会解决所有依赖项?

最佳答案

来自 URLCLassLoader 的文档:

This class loader is used to load classes and resources from a search path of URLs referring to both JAR files and directories. Any URL that ends with a '/' is assumed to refer to a directory. Otherwise, the URL is assumed to refer to a JAR file which will be opened as needed.

因此,您必须为目录或 .jars 使用 URL

两种解决方案:

  1. 强制您的用户向您提供 .jar 文件,包括某种 list ,其中包含他们希望加载的类名。 Bukkit 使用此方法开发商。以前用过这个方法,依赖包应该都打包在.jar文件里,在URLClassLoader的搜索路径下,才能加载。
  2. 使用文件目录的 URL,并在该目录中搜索 .class 文件。我不确定是否会使用此方法加载依赖项。

关于Java Classloader 无法加载模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10857720/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com