JavaFX загружает образ из Jar, который загружается внутри пользовательского загрузчика классов - PullRequest
0 голосов
/ 10 марта 2020

Я создаю приложение (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 и программно было бы здорово.

...