Я решил сделать для своего desktop-приложения на Java возможность его расширения за счет плагинов. Суть загрузки плагинов такова: приложение ищет в определенной директории jar-файл плагина и его дескриптор, описывающий название, версию, главный класс и т.д., с помощью URLClassLoader данный плагин загружается в приложение. При этом у плагина и у приложения должно быть подключено API, которое служит для взаимодействия плагина и приложения.
Я реализовал это и приступил к тестированию. При этом приложение, плагин к нему, API используют Maven
API подключается к приложению и плагину данным образом:
<dependency>
<groupId>название</groupId>
<artifactId>название api</artifactId>
<version>версия api</version>
<scope>system</scope>
<systemPath>${basedir}/api.jar</systemPath>
</dependency>
В приложение я загружаю плагин так:
loader = new URLClassLoader(new URL[] {info.getPluginJar().toURI().toURL()}, ClassLoader.getSystemClassLoader());
plugin = (Plugin) loader.loadClass(info.getMainClass()).newInstance();
Но при запуске возникает ошибка:
Exception in thread "main" java.lang.NoClassDefFoundError: название/пакет_api/PluginContext
Caused by: java.lang.ClassNotFoundException: название.пакет_api.PluginContext
Я так понял, что приложение не видит классы API, которые используются внутри плагина. И как быть в данной ситуации, я не знаю.