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() });
我在使用 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() });