Wiki-Quellcode von Plugin-Entwicklung
Zeige letzte Bearbeiter
author | version | line-number | content |
---|---|---|---|
1 | {{content/}} | ||
2 | |||
3 | |||
4 | {{formcycle/}} bietet ein Vielzahl von Einstiegspunkten für die Erweiterung der Standard-Funktionalitäten durch Plugins. Basierend auf den einzelnen [[Plugin-Typen>>doc:Formcycle.PluginDevelopment.Types.WebHome]] werden diese zu gewissen Zeitpunkten automatisch oder manuell angesprochen und erlauben es somit von der Ersetzung eigener Platzhalter bis hin zur Implementierung eigener Verarbeitungslogik {{formcycle/}} anzupassen. Als fundamentaler erster Schritt für die Entwicklung eigener Plugins ist hierbei das Erstellen eines entsprechenden Java-Projekts anzusehen. | ||
5 | |||
6 | == API-Dokumentation == | ||
7 | |||
8 | Die API-Dokumentation für {{formcycle/}} findet sich hier auf unserer Seite: [[JavaScript und JavaDocs>>https://docs.formcycle.eu/]] | ||
9 | |||
10 | == Maven-Setup == | ||
11 | |||
12 | Zu Beginn der Entwicklung eines Plugins ist es nötig, das entsprechende Entwicklungsprojekt aufzusetzten und zu konfigurieren. | ||
13 | |||
14 | Für letzteres empfehlen wir hierbei das Build-Management-Tool [[Apache Maven>>url:https://maven.apache.org/||rel="__blank"]] zu verwenden. Andere Build-Tools können prinzipiell auch genutzt werden, hier können wir aber keine Hilfe bereitstellen. | ||
15 | |||
16 | Um die entsprechenden Abhängigkeiten zu {{formcycle case="dat"/}} bereitzustellen, ist das Repository unter der URL [[https:~~/~~/artifactory.xima-services.de/artifactory/fc-plugin-dev>>url:https://artifactory.xima-services.de/artifactory/fc-plugin-dev]] zu benutzen. Dieses enthält alle öffentlich zur Verfügung stehenden Artefakte, welche dem Plugin zur Laufzeit bereitgestellt und während der Entwicklung benötigt werden. | ||
17 | |||
18 | Damit das Repository auch beim Bauen mit Maven verwendet wird, sollte folgendes in die Maven-Konfigurationsdatei //settings.xml// geschrieben werden. Diese Datei findet sich in der Regeln im //.m2//-Ordner im Home-Verzeichnis des aktuellen Nutzers. Unter Linux //~~/.m2/settings.xml// und unter Windows //%homepath%\.m2\settings.xml//: | ||
19 | |||
20 | {{panel title="~~~~/.m2/settings.xml" fullwidth="true" initial="hidden" triggerable="true"}} | ||
21 | {{code language="xml"}} | ||
22 | <?xml version="1.0" encoding="UTF-8"?> | ||
23 | <settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.1.0" | ||
24 | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> | ||
25 | |||
26 | <!-- Add XIMA artifactory --> | ||
27 | <profiles> | ||
28 | <profile> | ||
29 | <!-- FORMCYCLE dependencies --> | ||
30 | <repositories> | ||
31 | <repository> | ||
32 | <snapshots> | ||
33 | <enabled>false</enabled> | ||
34 | </snapshots> | ||
35 | <id>xima</id> | ||
36 | <name>fc-plugin-dev</name> | ||
37 | <url>https://artifactory.xima-services.de/artifactory/fc-plugin-dev</url> | ||
38 | </repository> | ||
39 | </repositories> | ||
40 | <!-- Maven plugins for FORMCYCLE --> | ||
41 | <pluginRepositories> | ||
42 | <pluginRepository> | ||
43 | <snapshots> | ||
44 | <enabled>false</enabled> | ||
45 | </snapshots> | ||
46 | <id>xima</id> | ||
47 | <name>fc-plugin-dev</name> | ||
48 | <url>https://artifactory.xima-services.de/artifactory/fc-plugin-dev</url> | ||
49 | </pluginRepository> | ||
50 | </pluginRepositories> | ||
51 | <id>xima-artifactory</id> | ||
52 | </profile> | ||
53 | </profiles> | ||
54 | |||
55 | <!-- Enable XIMA artifactory by default --> | ||
56 | <activeProfiles> | ||
57 | <activeProfile>xima-artifactory</activeProfile> | ||
58 | </activeProfiles> | ||
59 | |||
60 | <!-- FORMCYCLE specific Maven plugins provided by XIMA --> | ||
61 | <pluginGroups> | ||
62 | <pluginGroup>de.xima.fc.maven.plugin</pluginGroup> | ||
63 | </pluginGroups> | ||
64 | </settings> | ||
65 | {{/code}} | ||
66 | {{/panel}} | ||
67 | |||
68 | == Maven-Projekteinrichtung == | ||
69 | |||
70 | Im Folgenden werden einige Punkte beschrieben, die beim Einrichten eines Maven-Projekts für ein {{formcycle/}}-Plugin beachtet werden müssen. Für den schnellen Einstieg gibt auch einige [[Maven-Archetypes>>||anchor="HMaven-Archetypes"]]. | ||
71 | |||
72 | === Artekfakte und Abhängigkeiten === | ||
73 | |||
74 | {{info}} | ||
75 | Alle Abhängigkeiten zu {{formcycle case="dat"/}} sind im scope "provided" zu definieren! | ||
76 | {{/info}} | ||
77 | |||
78 | Eine fertige einfache //pom.xml// können Sie [[hier herunterladen>>attach:pom.xml||rel="__blank"]]. | ||
79 | |||
80 | Ausgangspunkt für die Entwicklung von Plugin ist das Maven-Artefakt //fc-plugin-common//. Dieses enthält die einzelnen Plugin-Schnittstellen und steht auch auf [[unsererer Downloadseite zur Verfügung>>url:http://artifactory.xima-services.de/artifactory/fc-plugin-dev/de/xima/fc/fc-plugin-common||rel="noopener noreferrer" target="_blank"]]. | ||
81 | |||
82 | In der //pom.xml// des Plugin-Projekts kann diese Abhängigkeit wie folgt eingebunden werden: | ||
83 | |||
84 | {{code language="xml"}} | ||
85 | <properties> | ||
86 | <xfc.version>7.2.1</xfc.version> | ||
87 | </properties> | ||
88 | |||
89 | <dependencies> | ||
90 | <dependency> | ||
91 | <groupId>de.xima.fc</groupId> | ||
92 | <artifactId>fc-plugin-common</artifactId> | ||
93 | <version>${xfc.version}</version> | ||
94 | <scope>provided</scope> | ||
95 | </dependency> | ||
96 | </dependencies> | ||
97 | {{/code}} | ||
98 | |||
99 | Ferner steht je nach Tiefe der Integration in die bestehende Umgebung von {{formcycle case="dat"/}} und deren Benutzung als höchste Implementierung das Artefakt //fc-logic// zur Verfügung. Dieses wird wie folgt als weitere (oder einzige) Abhängigkeit definiert: | ||
100 | |||
101 | {{code language="xml"}} | ||
102 | <dependency> | ||
103 | <groupId>de.xima.fc</groupId> | ||
104 | <artifactId>fc-logic</artifactId> | ||
105 | <version>${xfc.version}</version> | ||
106 | <scope>provided</scope> | ||
107 | </dependency> | ||
108 | {{/code}} | ||
109 | |||
110 | Eine entsprechende Benutzung ist vor allem bei der Verwendung der Datenbankschnittstelle sowie bei der Implementierung von eigenen Verarbeitungen nötig. | ||
111 | |||
112 | Ferner ist zu beachten, dass sämtliche Abhängigkeiten zu {{formcycle case="dat"/}} im scope //provided //anzugeben sind. Dies verhindert neben Classpath-Problemen auch das unnötige Anschwellen der Plugin-Größe. Ebenso sollten diesbezüglich Abhängigkeiten auf bereits von {{formcycle case="dat"/}} benutzten und damit bereitstehenden Bibliotheken wiederverwendet werden (z.B. diverse Apache Commons-Implementierungen). Solche Abhängigkeit sind auch im Scope //provided// zu definieren. Eine einfache Möglichkeit, Fehler zu vermeiden, ist das Importieren der FORMCYCLE-Bom: | ||
113 | |||
114 | {{code language="xml"}} | ||
115 | <dependencyManagement> | ||
116 | <dependencies> | ||
117 | <!--Import dependency versions from FORMCYCLE --> | ||
118 | <dependency> | ||
119 | <groupId>de.xima.fc</groupId> | ||
120 | <artifactId>fc</artifactId> | ||
121 | <version>${xfc.version}</version> | ||
122 | <type>pom</type> | ||
123 | <scope>import</scope> | ||
124 | </dependency> | ||
125 | </dependencies> | ||
126 | </dependencyManagement> | ||
127 | {{/code}} | ||
128 | |||
129 | Dann einfach die gewünschte Abhängigkeit ohne {{code}}<version>...</version>{{/code}} definieren. Wenn FORMCYCLE die Abhängigkeit schon enthält, gibt es keinen Build-Fehler. Andernfalls muss diese im Plugin mitgeliefert werden. In dem Fall die Version hinzufügen und den Provided-Scope entfernen. | ||
130 | |||
131 | === Manifest und Fat JAR === | ||
132 | |||
133 | In der //META-INF/MANIFEST.MF// in der Plugin-JAR-Datei sollten folgende Informationen stehen: | ||
134 | |||
135 | ; formcycle-version-requirement | ||
136 | : Erforderlich. Version von {{formcycle/}}, für die das Plugin gedacht ist. Ist erforderlich, damit {{formcycle/}} bei der Installation die Kompatibilität prüfen kann. | ||
137 | ; Implementation-Version | ||
138 | : Erforderlich. Version des Plugins; Diese wird z.B. in der Oberfläche angezeigt. | ||
139 | ; Plugin-Key | ||
140 | : Erforderlch. Wird zur Identifizierung des Plugin innherhalb von {{formcycle/}} verwendet, und auch von etwa dem Deploy-Plugin oder Server-Plugin. Empfohlener Wert ist {{code}}${project.groupId}:${project.artifactId}{{/code}}. | ||
141 | ; Build-Time oder Build-Timestamp | ||
142 | : Optional. Wird bei SNAPSHOT-Versionen mit angezeigt, um den SNAPSHOT zu identifizieren. | ||
143 | |||
144 | {{info}} | ||
145 | Bis einschließlich Version 7.x von {{formcycle/}} ist noch {{code}}Implementation-Title{{/code}} mit dem gleichen Wert wie {{code}}Plugin-Key{{/code}} erforderlich. | ||
146 | {{/info}} | ||
147 | |||
148 | Diese Informationen können wie unten beschrieben mittels des //maven-assembly-plugin// in die Manifest-Datei geschrieben werden. | ||
149 | |||
150 | Weiterhin ist beim Bauen zu beachten, dass eine sogenannte Fat-JAR gebaut werden muss. Abhängigkeiten zu {{formcycle case="dat"/}} sowie anderen Bibliotheken, welche bereits durch {{formcycle case="acc"/}} mitgeliefert werden, sollten wie bereits erwähnt im scope //provided// eingebunden werden. Falls im Plugin aber noch andere Abhängigkeiten benutzt werden, müssen diese in der JAR-Datei inkludiert werden (Fat JAR). | ||
151 | |||
152 | Dies kann entweder über das [[maven-assembly-plugin>>url:https://maven.apache.org/plugins/maven-assembly-plugin/]] oder das [[maven-shade-plugin>>url:https://maven.apache.org/plugins/maven-shade-plugin/]] erfolgen. Letzteres ist für forgeschrittene Anwendungsfälle gedacht, wenn etwa mehrere Abhängigkeiten die gleichen Dateien mitbringen und zusammengeführt werden müssen. | ||
153 | |||
154 | Für einfache Plugins ist das //maven-assembly-plugin// ausreichend. Dieses kann in der //pom.xml// wie folgt konfiguriert werden: | ||
155 | |||
156 | {{panel title="maven-assembly-plugin in pom.xml" fullwidth="true" initial="hidden" triggerable="true"}} | ||
157 | {{code language="java"}} | ||
158 | <properties> | ||
159 | <maven-assembly-plugin.version>3.3.0</maven-assembly-plugin.version> | ||
160 | </properties> | ||
161 | <build> | ||
162 | <finalName>${project.artifactId}</finalName> | ||
163 | <plugins> | ||
164 | <plugin> | ||
165 | <groupId>org.apache.maven.plugins</groupId> | ||
166 | <artifactId>maven-assembly-plugin</artifactId> | ||
167 | <version>${maven-assembly-plugin.version}</version> | ||
168 | <executions> | ||
169 | <execution> | ||
170 | <id>fat-jar</id> | ||
171 | <phase>package</phase> | ||
172 | <goals> | ||
173 | <goal>single</goal> | ||
174 | </goals> | ||
175 | <configuration> | ||
176 | <finalName>${project.artifactId}</finalName> | ||
177 | <appendAssemblyId>false</appendAssemblyId> | ||
178 | <descriptorRefs> | ||
179 | <descriptorRef>jar-with-dependencies</descriptorRef> | ||
180 | </descriptorRefs> | ||
181 | <archive> | ||
182 | <manifest> | ||
183 | <addDefaultImplementationEntries>true</addDefaultImplementationEntries> | ||
184 | </manifest> | ||
185 | <manifestEntries> | ||
186 | <formcycle-version-requirement>${xfc-version}</formcycle-version-requirement> | ||
187 | <Build-Timestamp>${maven.build.timestamp}</Build-Timestamp> | ||
188 | <Implementation-Title>${project.groupId}:${project.artifactId}</Implementation-Title> | ||
189 | <Implementation-Vendor-Id>${project.groupId}</Implementation-Vendor-Id> | ||
190 | <Implementation-Version>${project.version}</Implementation-Version> | ||
191 | </manifestEntries> | ||
192 | </archive> | ||
193 | </configuration> | ||
194 | </execution> | ||
195 | </executions> | ||
196 | </plugin> | ||
197 | </plugins> | ||
198 | </build> | ||
199 | {{/code}} | ||
200 | {{/panel}} | ||
201 | |||
202 | === Bauen und Installieren === | ||
203 | |||
204 | Der genaue Befehl zum Bauen hängt von den konkreten Einstellungen in der //pom.xml// ab. In der Regel sollte aber folgender Standardbefehl im Plugin-Verzeichnis funktionieren: | ||
205 | |||
206 | {{code}} | ||
207 | mvn clean install | ||
208 | {{/code}} | ||
209 | |||
210 | Nachdem das Plugin erfolgreich gebaut wurde, kann die so entstandene JAR-Datei im //target//-Verzeichnis in {{formcycle/}} über die Oberfläche [[Mandant-Plugins>>doc:Formcycle.UserInterface.Client.Plugins]] beziehungsweise [[System-Plugins>>doc:Formcycle.SystemSettings.UserInterface.SystemPlugins]] hochgeladen werden. | ||
211 | |||
212 | Siehe [[Deploy-Plugin>>||anchor="HDeploy-Plugin"]] zum automatischen Hochladen beim Maven-Build. | ||
213 | |||
214 | Siehe [[FC-Server-Plugin>>||anchor="HFC-Server-Plugin"]] zum Starten eines einfachen {{formcycle/}}-Servers. | ||
215 | |||
216 | == Maven-Archetypes == | ||
217 | |||
218 | {{figure image="eclipse-archetype.png" width="500"}} | ||
219 | Hinzufügen des Archetypes-Katalogs in Eclipse | ||
220 | {{/figure}} | ||
221 | |||
222 | {{figure image="eclipse-archetype-select.png" width="500"}} | ||
223 | Auswahl eines Archetypes beim Erstellen eines Maven-Projekts in Eclipse | ||
224 | {{/figure}} | ||
225 | |||
226 | Für einige häufig verwendete Plugin-Typen stehen [[Maven-Archetypes>>url:https://maven.apache.org/guides/introduction/introduction-to-archetypes.html||rel="noopener noreferrer" target="_blank"]] bereits, um schnell ein Maven-Projekt aufsetzen zu können. | ||
227 | |||
228 | Voraussetzung für die Verwendung ist, dass in den //~~/.m2/settings.xml// wie oben beschrieben das XIMA-Artifactory eingerichtet wurde. Dann kann etwa über die Kommandozeile wie folgt eine Archetype generiert werden: | ||
229 | |||
230 | {{code}} | ||
231 | mvn archetype:generate -DarchetypeArtifactId=plugin-archetype-workflow-element-simple -DarchetypeGroupId=de.xima.fc.archetype -DarchetypeVersion=7.0.4 | ||
232 | {{/code}} | ||
233 | |||
234 | Es werden dann einige wenige Informationen wie die gewünschten Maven-Koordinaten des neuen Plugin-Projekts abgefragt und anschließend ein neues vorkonfiguriertes Projekt erstellt. | ||
235 | |||
236 | Alle vorhandenen Archetypes und deren Versionen können im [[Archetype-Katalog>>url:https://artifactory.xima-services.de/artifactory/libs-release-local/archetype-catalog.xml||rel="noopener noreferrer" target="_blank"]] eingesehen werden. | ||
237 | |||
238 | In Eclipse kann der Archetype-Katalog in den Einstellungen hinzugefügt werden. Bei der Erstellung eines neuen Maven-Projekt werden dann alle verfügbaren Archetypes angezeigt: | ||
239 | |||
240 | {{code language="plaintext"}} | ||
241 | https://artifactory.xima-services.de/artifactory/libs-release-local/archetype-catalog.xml | ||
242 | {{/code}} | ||
243 | |||
244 | == Deploy-Plugin == | ||
245 | |||
246 | Um beim Entwickeln nicht jedes Mal eine neue Plugin-Version manuell über die Oberfläche hochladen zu müssen, kann das Deploy-Plugin verwendet werden. Dieses besteht aus 2 Teilen: | ||
247 | |||
248 | * Ein Maven-Plugin, welches nach dem Bauen das Plugin via HTTP an einen laufenden {{formcycle/}}-Server sendet | ||
249 | * Ein Plugin für {{formcycle/}}, welche die Gegenstelle in {{formcycle/}} bereitstellt und das Plugin aus dem HTTP-Request in {{formcycle/}} installiert. | ||
250 | |||
251 | Weitere Details können im [[Hilfe-Artikel zum Deploy-Plugin>>doc:Formcycle.PluginDocumentation.FormcycleDeployPluginPlugin]] nachgelesen werden. Für die meisten Fälle ist kene Konfiguration in der //pom.xml// erforderlich. Es empfiehlt sich aber, wenigstens die Version festzusetzen: | ||
252 | |||
253 | {{code language="xml"}} | ||
254 | <properties> | ||
255 | <fc-deploy-plugin-maven-plugin.version>7.0.1<fc-deploy-plugin-maven-plugin.version></fc-deploy-plugin-maven-plugin> | ||
256 | <build> | ||
257 | <plugins> | ||
258 | <plugin> | ||
259 | <groupId>de.xima.fc.maven.plugin</groupId> | ||
260 | <artifactId>fc-deploy-plugin-maven-plugin</artifactId> | ||
261 | <version>${fc-deploy-plugin-maven-plugin.version}</version> | ||
262 | </plugin> | ||
263 | </plugins> | ||
264 | </build> | ||
265 | {{/code}} | ||
266 | |||
267 | Sofern das Deploy-Plugin bereits in {{formcycle/}} installiert ist, kann das Plugin-Projekt dann wie folgt gebaut und hochgeladen werden: | ||
268 | |||
269 | {{code language="bash"}} | ||
270 | mvn fc-deploy:deploy | ||
271 | {{/code}} | ||
272 | |||
273 | Es wird hierbei davon ausgegangen, dass {{formcycle/}} unter der Standard-URL {{code}}http://localhost:8080/xima-formcycle{{/code}} läuft und das Standard-Passwort "admin" für das Deploy-Plugin verwendet wird. Ist dies nicht der Fall, können die Werte auch angepasst werden: | ||
274 | |||
275 | {{code language="bash"}} | ||
276 | mvn package fc-deploy:deploy -DfcDeployUrl=http://localhost:8080/xima-formcycle -DfcDeployToken=admin | ||
277 | {{/code}} | ||
278 | |||
279 | {{info}} | ||
280 | Bis einschließlich Version 7.x von {{formcycle/}} und dem Maven-Plugin ist es noch erforderlich, die package-Phase explizit aufzuführen. Zudem müssen die URL und das Passwort angegeben werden. Ab Version 8.x sind die Standardwerte gesetzt und die package-Phase wird automatisch ausgeführt. | ||
281 | {{/info}} | ||
282 | |||
283 | Soll das Plugin im Bereich eines bestimmten Mandanten registriert werden, so kann dies über den zusätzlichen Launch-Configuration Parameter //fcDeployClientId //erreicht werden. Dieser Parameter muss als Wert die Id des Mandanten enthalten. | ||
284 | |||
285 | == FC-Server-Plugin == | ||
286 | |||
287 | Zum Testen eines Plugins ist es erforderlich, einen laufenden {{formcycle/}}-Server zu haben. Zur Vereinfachung der Entwicklung gibt es das //fc-server-maven-plugin//, welches mittels eines einzigen Befehls ein fertig eingerichtetes {{formcycle/}} lokal startet, wo auch bereits das Deploy-Plugin vorinstalliert ist. | ||
288 | |||
289 | Sofern wie oben beschrieben in //~~/.m2/settings.xml// die //pluginGroup// hinterlegt wurde, kann in einem beliebiegen Verzeichnis wie folgt ein {{formcycle/}}-Server per Maven gestartet werden: | ||
290 | |||
291 | {{code language="bash"}} | ||
292 | # Aktuelle Version starten | ||
293 | mvn fc-server:run-ms-war | ||
294 | |||
295 | # Spezifische Version starten | ||
296 | mvn de.xima.fc.maven.plugin:fc-server-maven-plugin:7.0.4:run-ms-war -DxfcVersion=7.0.16 | ||
297 | {{/code}} | ||
298 | |||
299 | {{info}} | ||
300 | Wir empfehlen die Nutzung von Java 11. Bei Nutzung von Java 17 kann es aktuell zu Problemen beim Starten von {{formcycle/}} kommen. | ||
301 | {{/info}} | ||
302 | |||
303 | {{info}} | ||
304 | Bis einschließlich Version 7.x von {{formcycle/}} und dem Maven-Plugin ist es noch erforderlich, die package-Phase explizit aufzuführen: {{code}}mvn package fc-server:run-ms-war{{/code}}. Ab Version 8.x geschieht dies automatisch. | ||
305 | {{/info}} | ||
306 | |||
307 | {{info}} | ||
308 | Die Major- und Minor-Version des Maven-Plugins sollte immer der Major- und Minor-Version des zu startenden {{formcycle case="gen"/}} entsprechen. Für {{formcycle/}} 7.0.x sollte also das Maven-Plugin in Version 7.0.x verwendet werde, für {{formcycle/}} 7.1.x das Maven-Plugin in Version 7.1.x usw. | ||
309 | {{/info}} | ||
310 | |||
311 | Nach kurzer Wartezeit (beim ersten Mal kann es länger dauern) ist dann ein {{formcycle/}}-Server gestartet. Die URL steht am Ende in der Kommandozeile, standardmäßig http://localhost:8080/xima-formcycle Der Zugang für den Superadmin ist {{code language="plaintext"}}sadmin{{/code}} (Passwort {{code language="plaintext"}}admin{{/code}}), der Zugang für den Mandantadministrator {{code language="plaintext"}}admin{{/code}} (Passwort {{code language="plaintext"}}/admin_{{/code}}). | ||
312 | |||
313 | Falls der Befehl in einem Maven-Projekt eines {{formcycle/}}-Plugins ausgeführt wird, dann wird das Plugin automatisch gebaut und nach dem Starten des Servers hochgeladen und installiert. Zudem wird versucht, die {{formcycle/}}-Version aus dem Plugin-Projekt auszulesen. | ||
314 | |||
315 | Dies funktioniert auch in einem Ordner ohne Maven-Projekt. Falls keine {{formcycle/}}-Version angegeben ist, wird eine Standard-Version genommen, abhängig von der Maven-Plugin-Version. | ||
316 | |||
317 | Für fortgeschrittenen Gebrauch siehe die [[README.md>>attach:README.md||rel="__blank"]]. |