我正在构建一个可以通过插件扩展的应用程序(JavaFX 13)。我通过解析插件目录将jar加载到自定义URLClassLoader中。
URLClassLoader cl = FileSystemFinder.getInstance().getPluginClassLoader();
FXMLLoader loader = new FXMLLoader();
loader.setClassLoader(cl);
Pane foo = loader.load(fxml);
在插件内部,如果fxml文件尝试通过ImageView添加图像,则失败,原因是:java.lang.IllegalArgumentException: Invalid URL or resource not found
。
<graphic>
<ImageView fitHeight="16.0" fitWidth="16.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@folder.png" />
</image>
</ImageView>
</graphic>
我也尝试从罐子里的FXMl控制器那样以编程方式执行此操作:
String imagePath = getclass().getclassLoader().getResource("foo.bar/plugin/folder.png").toExternalForm();
imageView.setImage(new Image(imagePath));
这里imagePath
= jar:file:/Users/myUser/my-app/plugins/my-app-pluginName-1.0-snAPSHOT.jar!/foo.bar/plugin/jsf/folder.png
所以我的假设是,Image使用Application ClassLoader而不是我创建的Custom ClassLoader。
在javafx.scene.image.Image
行1107中,有:
final ClassLoader contextClassLoader = Thread.currentThread().getcontextClassLoader();
所以对我而言,Image类不使用用于加载FXML文件的类加载器。
有人可以告诉我如何处理此案?通过FXML并以编程方式会很棒。