org.projectforge.plugins.core.AbstractPlugin (ServiceLoader)IHKPlugin als Implementierung von org.projectforge.plugins.core.AbstractPlugin registriert. Diese einzeilige Datei ist der Mechanismus, über den das IHK-Plugin zur Laufzeit erkannt und geladen wird.org.projectforge.plugins.ihk.IHKPlugin
Diese Datei befindet sich im standardmäßigen Java ServiceLoader-Pfad META-INF/services/{vollqualifizierter-Schnittstellenname}. Wenn der Plugin-Scanner von ProjectForge ServiceLoader.load(AbstractPlugin.class) aufruft, liest die JVM alle derartigen Dateien aus dem Klassenpfad, instanziiert jede aufgeführte Klasse und ruft initialize() für jede Plugin-Instanz auf.
PFPluginService (oder ein gleichwertiger Plugin-Scanner) ruft ServiceLoader.load(AbstractPlugin.class) auf.META-INF/services/org.projectforge.plugins.core.AbstractPlugin in jedem Plugin-JAR oder Klassenpfadeintrag.AbstractPlugin registriert die Metadaten des Plugins (ID, Name, Beschreibung).initialize() auf, wo IHKPlugin seine DAO-, Web-, Menü-, Rechte- und i18n-Registrierungen durchführt.java.util.ServiceLoader anstelle von Springs @Component-Scanning für die Plugin-Erkennung. Dies ermöglicht das Laden von Plugins aus externen JARs, die in ein Plugin-Verzeichnis gelegt werden, unabhängig von Springs Component-Scan-Base-Packages.IHKPlugin.IHKPlugin selbst keine Spring-Bean ist, werden die Komponenten, die es verdrahtet (über WicketSupport.get()), von Spring verwaltet. Dieser hybride Ansatz hält den Plugin-Lebenszyklus vom Spring-Kontext-Lebenszyklus getrennt.org.projectforge.plugins.todo.ToDoPlugin (siehe #287), das Memo-Plugin hat org.projectforge.plugins.memo.MemoPlugin usw.50d5d8926 wip: META-INF/services für Plugins benötigt (Service Loader) 07b80966b wip: PFPluginService (PluginConfig) -> PluginInfo 45cad02e9 IHK-Plugin hinzugefügt (wird "Ihk-Export"-Plugin ersetzen)