org.projectforge.plugins.core.AbstractPlugin (ServiceLoader)IHKPlugin как реализацию org.projectforge.plugins.core.AbstractPlugin. Этот однострочный файл является механизмом, с помощью которого плагин IHK обнаруживается и загружается во время выполнения.org.projectforge.plugins.ihk.IHKPlugin
Этот файл находится по стандартному пути Java ServiceLoader META-INF/services/{полное-имя-интерфейса}. Когда сканер плагинов ProjectForge вызывает ServiceLoader.load(AbstractPlugin.class), JVM читает все такие файлы из classpath, создаёт экземпляры каждого указанного класса и вызывает initialize() для каждого экземпляра плагина.
PFPluginService (или эквивалентный сканер плагинов) вызывает ServiceLoader.load(AbstractPlugin.class).META-INF/services/org.projectforge.plugins.core.AbstractPlugin в каждом JAR-файле плагина или записи classpath.AbstractPlugin регистрирует метаданные плагина (ID, имя, описание).initialize(), где IHKPlugin выполняет регистрацию DAO, веб-компонентов, меню, прав и i18n.java.util.ServiceLoader, а не сканирование @Component от Spring для обнаружения плагинов. Это позволяет загружать плагины из внешних JAR-файлов, помещённых в директорию плагинов, независимо от базовых пакетов сканирования компонентов Spring.IHKPlugin.IHKPlugin не является бином Spring, компоненты, которые он связывает (через WicketSupport.get()), управляются Spring. Этот гибридный подход позволяет разделить жизненный цикл плагина и жизненный цикл контекста Spring.org.projectforge.plugins.todo.ToDoPlugin (см. #287), плагин Memo имеет org.projectforge.plugins.memo.MemoPlugin и т.д.50d5d8926 wip: META-INF/services необходимы для плагинов (Service loader) 07b80966b wip: PFPluginService (PluginConfig) -> PluginInfo 45cad02e9 Добавлен плагин IHK (заменит плагин "Ihk-Export")