Я создаю приложение (JavaFX 13), которое можно расширить с помощью плагинов. Я загружаю фляги в пользовательский URLClassLoader, анализируя каталог плагинов.
URLClassLoader cl = FileSystemFinder.getInstance().getPluginClassLoader();
FXMLLoader loader = new FXMLLoader();
loader.setClassLoader(cl);
Pane foo = loader.load(fxml);
Внутри плагина, если файл af xml пытается добавить изображение через 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>
Я попытался сделать это программно, например, из контроллера F XMl внутри банки:
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 использует ApplicationLoader ClassLoader вместо пользовательского ClassLoader, который я создал.
В javafx.scene.image.Image
строке 1107 есть:
final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
Так что для меня класс Image не использует загрузчик классов для загрузки файла F XML.
Кто-то может сказать мне, как я могу справиться с этим делом? через F XML и программно было бы здорово.