org.projectforge.plugins.core.AbstractPlugin (ServiceLoader)IHKPlugin as an implementation of org.projectforge.plugins.core.AbstractPlugin. This single-line file is the mechanism by which the IHK plugin is discovered and loaded at runtime.org.projectforge.plugins.ihk.IHKPlugin
This file sits at the standard Java ServiceLoader path META-INF/services/{fully-qualified-interface-name}. When ProjectForge's plugin scanner invokes ServiceLoader.load(AbstractPlugin.class), the JVM reads all such files from the classpath, instantiates each listed class, and calls initialize() on each plugin instance.
PFPluginService (or equivalent plugin scanner) calls ServiceLoader.load(AbstractPlugin.class).META-INF/services/org.projectforge.plugins.core.AbstractPlugin in each plugin JAR or classpath entry.AbstractPlugin base class constructor registers the plugin's metadata (ID, name, description).initialize(), where IHKPlugin performs its DAO, web, menu, right, and i18n registrations.java.util.ServiceLoader rather than Spring's @Component scanning for plugin discovery. This allows plugins to be loaded from external JARs dropped into a plugin directory, independent of Spring's component scan base packages.IHKPlugin.IHKPlugin itself is not a Spring bean, the components it wires (via WicketSupport.get()) are Spring-managed. This hybrid approach keeps plugin lifecycle separate from Spring context lifecycle.org.projectforge.plugins.todo.ToDoPlugin (see #287), the Memo plugin has org.projectforge.plugins.memo.MemoPlugin, etc.50d5d8926 wip: META-INF/services needed for plugins (Service loader) 07b80966b wip: PFPluginService (PluginConfig) -> PluginInfo 45cad02e9 IHK-Plugin added (Will replace "Ihk-Export"-Plugin)