Wiki-Quellcode von Plugin-Entwicklung


Zeige letzte Bearbeiter
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: [[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"]] zum Einsatz. Andere Build-Tools können prinzipiell benutzt 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 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 [[unserere Downloadseite zur Verfügung>>url:http://artifactory.xima-services.de/artifactory/fc-plugin-dev/de/xima/fc/fc-plugin-common||target="_blank"]].
79
80 In der //pom.xml// des Plugin-Projekts kann diese Abhängigkeit wie folgt eingebunden werden:
81
82 {{code language="xml"}}
83 <properties>
84 <xfc.version>7.0.10</xfc.version>
85 </properties>
86
87 <dependencies>
88 <dependency>
89 <groupId>de.xima.fc</groupId>
90 <artifactId>fc-plugin-common</artifactId>
91 <version>${xfc.version}</version>
92 <scope>provided</scope>
93 </dependency>
94 </dependencies>
95 {{/code}}
96
97 Ferner steht je nach Tiefe der Integration in die bestehende Umgebung von {{formcycle case="dat"/}} und dessen Benutzung als höchste Implementierung das Artefakt //fc-logic// zur Verfügung. Dieses wird wie folgt als weitere (oder einzige) Abhängigkeit definiert:
98
99 {{code language="xml"}}
100 <dependency>
101 <groupId>de.xima.fc</groupId>
102 <artifactId>fc-logic</artifactId>
103 <version>${xfc.version}</version>
104 <scope>provided</scope>
105 </dependency>
106 {{/code}}
107
108 Eine entsprechende Benutzung ist vor allem bei der Verwendung der Datenbankschnittstelle sowie bei der Implementierung von eigenen Verarbeitungen nötig. Eine Vorlage für ein somit entstehendes Project Object Model finden Sie [[hier>>attach:pom.xml||rel="__blank"]].
109
110 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).
111
112 === Manifest und Fat JAR
113
114 In der //META-INF/MANIFEST.MF// in der Plugin-JAR-Datei sollten folgende Informationen stehen:
115
116 ; formcycle-version-requirement
117 : Erforderlich. Version von {{formcycle/}}, für die das Plugin gedacht ist.Ist erforderlich, damit {{formcycle/}} bei der Installation die Kompatibilität prüfen kann.
118 ; Implementation-Version
119 : Erforderlich. Version des Plugins, wird etwa in der Oberfläche angezeigt.
120 ; Build-Time oder Build-Timestamp
121 : Optional, wird bei SNAPSHOT-Versionen mit angezeigt, um den SNAPSHOT zu identifizieren.
122 ; Implementation-Title
123 : Optional, wird standardmäßig etwa vom Deploy-Plugin verwendet, um das Plugin zu identifzieren.
124
125 Diese Informationen können wie unten beschrieben mittels des //maven-assembly-plugin// in die Manifest-Datei geschrieben werden.
126
127 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).
128
129 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.
130
131 Für einfache Plugins ist das //maven-assembly-plugin// ausreichend. Dieses kann in der //pom.xml// wie folgt konfiguriert werden:
132
133 {{panel title="maven-assembly-plugin in pom.xml" fullwidth="true" initial="hidden" triggerable="true"}}
134 {{code language="java"}}
135 <properties>
136 <maven-assembly-plugin.version>3.3.0</maven-assembly-plugin.version>
137 </properties>
138 <build>
139 <finalName>${project.artifactId}</finalName>
140 <plugins>
141 <plugin>
142 <groupId>org.apache.maven.plugins</groupId>
143 <artifactId>maven-assembly-plugin</artifactId>
144 <version>${maven-assembly-plugin.version}</version>
145 <executions>
146 <execution>
147 <id>fat-jar</id>
148 <phase>package</phase>
149 <goals>
150 <goal>single</goal>
151 </goals>
152 <configuration>
153 <finalName>${project.artifactId}</finalName>
154 <appendAssemblyId>false</appendAssemblyId>
155 <descriptorRefs>
156 <descriptorRef>jar-with-dependencies</descriptorRef>
157 </descriptorRefs>
158 <archive>
159 <manifest>
160 <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
161 </manifest>
162 <manifestEntries>
163 <formcycle-version-requirement>${xfc-version}</formcycle-version-requirement>
164 <Build-Timestamp>${maven.build.timestamp}</Build-Timestamp>
165 <Implementation-Title>${project.groupId}:${project.artifactId}</Implementation-Title>
166 <Implementation-Vendor-Id>${project.groupId}</Implementation-Vendor-Id>
167 <Implementation-Version>${project.version}</Implementation-Version>
168 </manifestEntries>
169 </archive>
170 </configuration>
171 </execution>
172 </executions>
173 </plugin>
174 </plugins>
175 </build>
176 {{/code}}
177 {{/panel}}
178
179 === Bauen und Installieren ===
180
181 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:
182
183 {{code}}
184 mvn clean install
185 {{/code}}
186
187 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.
188
189 Siehe [[Deploy-Plugin>>||anchor="HDeploy-Plugin"]] zum automatischen Hochladen beim Maven-Build.
190
191 Siehe [[FC-Server-Plugin>>||anchor="HFC-Server-Plugin"]] zum Starten eines einfachen {{formcycle/}}-Servers.
192
193 == Maven-Archetypes ==
194
195 {{figure image="eclipse-archetype.png" width="500"}}
196 Hinzufügen des Archetypes-Katalogs in Eclipse
197 {{/figure}}
198
199 {{figure image="eclipse-archetype-select.png" width="500"}}
200 Auswahl eines Archetypes beim Erstellen eines Maven-Projekts in Eclipse
201 {{/figure}}
202
203 Für einige häufig verwendete Plugin-Typen stehen [[Maven-Archetypes>>url:https://maven.apache.org/guides/introduction/introduction-to-archetypes.html||target="_blank"]] bereits, um schnell ein Maven-Projekt aufsetzen zu können.
204
205 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:
206
207 {{code}}
208 mvn archetype:generate -DarchetypeArtifactId=plugin-archetype-workflow-element-simple -DarchetypeGroupId=de.xima.fc.archetype -DarchetypeVersion=7.0.4
209 {{/code}}
210
211 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.
212
213 Alle vorhandenen Archetypes und deren Versionen können im [[Archetype-Katalog>>url:https://artifactory.xima-services.de/artifactory/libs-release-local/archetype-catalog.xml||target="_blank"]] eingesehen werden.
214
215 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:
216
217 {{code language="plaintext"}}https://artifactory.xima-services.de/artifactory/libs-release-local/archetype-catalog.xml{{/code}}
218
219 == Deploy-Plugin
220
221 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:
222
223 * Ein Maven-Plugin, welches nach dem Bauen das Plugin via HTTP an einen laufenden {{formcycle/}}-Server sendet
224 * Ein Plugin für {{formcycle/}}, welche die Gegenstelle in {{formcycle/}} bereitstellt und das Plugin aus dem HTTP-Request in {{formcycle/}} installiert.
225
226 Weitere Details können im [[Hilfe-Artikel zum Deploy-Plugin>>doc:Formcycle.PluginDocumentation.FormcycleDeployPluginPlugin]] nachgelesen werden. Für die meisten Fälle reicht folgende Konfiguration in der //pom.xml// des Plugin-Projekts aus:
227
228 {{code language="xml"}}
229 <properties>
230 <fc-deploy-plugin-maven-plugin.version>7.0.1<fc-deploy-plugin-maven-plugin.version/>
231 <build>
232 <plugins>
233 <plugin>
234 <groupId>de.xima.fc.maven.plugin</groupId>
235 <artifactId>fc-deploy-plugin-maven-plugin</artifactId>
236 <version>${fc-deploy-plugin-maven-plugin.version}</version>
237 <executions>
238 <execution>
239 <id>upload</id>
240 <phase>install</phase>
241 <goals>
242 <goal>deploy</goal>
243 </goals>
244 </execution>
245 </executions>
246 </plugin>
247 </plugins>
248 </build>
249 {{/code}}
250
251 Sofern das Deploy-Plugin bereits in {{formcycle/}} installiert ist, kann das Plugin-Projekt dann beim Bauen wie folgt hochgeladen werden:
252
253 {{code language="bash"}}
254 mvn clean install -DfcDeployUrl=http://localhost:8080/xima-formcycle -DfcDeployToken=admin
255 {{/code}}
256
257 Wird Eclipse benutzt, kann auch eine Launch-Configuration mit den //fcDeployUrl// und dem //fcDeployToken// angelegt werden.
258
259 == FC-Server-Plugin ==
260
261 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.
262
263 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:
264
265 {{code language="bash"}}
266 mvn fc-server:run-ms-war -DxfcVersion=7.0.10
267 {{/code}}
268
269 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
270
271 Dies funktioniert auch in einem Ordner ohne Maven-Projekt. Falls keine {{formcycle/}} angegeben ist, wird eine Standard-Version genommen. Wird der Befehl innerhalb eines Plugin-Maven-Projekts ausgeführt, wird versucht, die Version von {{formcycle/}} aus dem Plugin-Projekt auszulesen.