ClassNotFoundException: module.MainController 在 window 但在 linux 中工作

ClassNotFoundException: module.MainController in window but work in linux

我在使用 URLClassLoader.loadClass() 时遇到了这个异常。

public BorderPane getFXML(String moduleName) throws MalformedURLException,
        ClassNotFoundException, NoSuchMethodException, SecurityException,
        InstantiationException, IllegalAccessException,
        IllegalArgumentException, InvocationTargetException {
    File fileModule = new File("modules/" + moduleName);

    URLClassLoader urlClassLoader = new URLClassLoader(new URL[] { new URL(
            "file://" + fileModule.getAbsolutePath()) });
    Class mainController = urlClassLoader.loadClass("module.MainController");

    Constructor constructor = mainController.getConstructor(Stage.class);
    Object mainControllerObj = constructor.newInstance(primaryStage);

    Method getFXML = mainController.getMethod("getFXML");
    BorderPane root = (BorderPane) getFXML.invoke(mainControllerObj);

    return root;
}

它在 Linux 中运行,但是当我在 Window 中运行时抛出了这个异常。

将文件转换为绝对 URL 的首选方法如下所示:

file.getAbsoluteFile().toURI().toURL()

行为上的差异可能是因为在 Windows 上,绝对路径通常包含驱动器,如果它没有附加前缀 /,则可能找不到文件。

所以在你的情况下,这最好是这样的:

File fileModule = new File("modules/" + moduleName);
URLClassLoader urlClassLoader = new URLClassLoader(new URL[] { 
        fileModule.getAbsoluteFile().toURI().toURL() });