blob: fde6de05892466358fbd73fca63b1e9ce6027a4e [file] [log] [blame]
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +01001<?xml version="1.0"?>
Matthias Andreas Benkard545aeb62020-12-06 15:16:22 +01002<project
3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
4 xmlns="http://maven.apache.org/POM/4.0.0"
5 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +01006
7 <modelVersion>4.0.0</modelVersion>
8
9 <groupId>eu.mulk</groupId>
10 <artifactId>aendggner</artifactId>
11 <version>${revision}</version>
12
13 <properties>
14 <maven.compiler.parameters>true</maven.compiler.parameters>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +020015 <maven.compiler.release>21</maven.compiler.release>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010016
17 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
18 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
19
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +020020 <enforced.maven-version>3.9.0</enforced.maven-version>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010021
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +020022 <build-helper-plugin.version>3.6.0</build-helper-plugin.version>
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +020023 <clean-plugin.version>3.3.2</clean-plugin.version>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +020024 <compiler-plugin.version>3.15.0</compiler-plugin.version>
25 <dependency-plugin.version>3.11.0</dependency-plugin.version>
26 <enforcer-plugin.version>3.6.3</enforcer-plugin.version>
27 <exec-plugin.version>3.6.3</exec-plugin.version>
28 <jar-plugin.version>3.5.0</jar-plugin.version>
29 <resources-plugin.version>3.5.0</resources-plugin.version>
30 <spotless-plugin.version>3.8.0</spotless-plugin.version>
31 <surefire-plugin.version>3.5.6</surefire-plugin.version>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010032
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +020033 <google.java.format.version>1.28.0</google.java.format.version>
34
35 <assertj.version>3.27.7</assertj.version>
36 <java-diff-utils.version>4.17</java-diff-utils.version>
37 <jboss-logging.version>3.6.3.Final</jboss-logging.version>
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +020038 <jzlib.version>1.1.5</jzlib.version>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +020039 <jspecify.version>1.0.0</jspecify.version>
40 <junit.version>5.13.4</junit.version>
41 <pdfbox.version>3.0.8</pdfbox.version>
42 <picocli.version>4.7.7</picocli.version>
43 <slf4j.version>2.0.18</slf4j.version>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010044 </properties>
45
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +020046 <dependencyManagement>
47 <dependencies>
48 <dependency>
49 <groupId>org.junit</groupId>
50 <artifactId>junit-bom</artifactId>
51 <version>${junit.version}</version>
52 <type>pom</type>
53 <scope>import</scope>
54 </dependency>
55 </dependencies>
56 </dependencyManagement>
57
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010058 <dependencies>
59
60 <!-- Annotations -->
61 <dependency>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +020062 <groupId>org.jspecify</groupId>
63 <artifactId>jspecify</artifactId>
64 <version>${jspecify.version}</version>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010065 </dependency>
66
Matthias Andreas Benkard31a2c502020-11-22 14:36:27 +010067 <!-- Command line parsing -->
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010068 <dependency>
69 <groupId>info.picocli</groupId>
70 <artifactId>picocli</artifactId>
71 <version>${picocli.version}</version>
72 </dependency>
73
Matthias Andreas Benkard545aeb62020-12-06 15:16:22 +010074 <!-- Logging -->
75 <dependency>
76 <groupId>org.jboss.logging</groupId>
77 <artifactId>jboss-logging</artifactId>
78 <version>${jboss-logging.version}</version>
79 </dependency>
Matthias Andreas Benkard545aeb62020-12-06 15:16:22 +010080 <dependency>
81 <groupId>org.slf4j</groupId>
82 <artifactId>slf4j-jdk14</artifactId>
83 <version>${slf4j.version}</version>
84 </dependency>
85 <dependency>
86 <groupId>org.slf4j</groupId>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +020087 <artifactId>jcl-over-slf4j</artifactId>
Matthias Andreas Benkard545aeb62020-12-06 15:16:22 +010088 <version>${slf4j.version}</version>
89 </dependency>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +020090
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +020091 <!-- PDF text extraction -->
Matthias Andreas Benkard31a2c502020-11-22 14:36:27 +010092 <dependency>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +020093 <groupId>org.apache.pdfbox</groupId>
94 <artifactId>pdfbox</artifactId>
95 <version>${pdfbox.version}</version>
96 </dependency>
97
98 <!-- Text diffing -->
99 <dependency>
100 <groupId>io.github.java-diff-utils</groupId>
101 <artifactId>java-diff-utils</artifactId>
102 <version>${java-diff-utils.version}</version>
103 </dependency>
104
105 <!-- Testing -->
106 <dependency>
107 <groupId>org.junit.jupiter</groupId>
108 <artifactId>junit-jupiter</artifactId>
109 <scope>test</scope>
Matthias Andreas Benkard31a2c502020-11-22 14:36:27 +0100110 </dependency>
111 <dependency>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +0200112 <groupId>org.assertj</groupId>
113 <artifactId>assertj-core</artifactId>
114 <version>${assertj.version}</version>
115 <scope>test</scope>
Matthias Andreas Benkard31a2c502020-11-22 14:36:27 +0100116 </dependency>
117
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100118 </dependencies>
119
120 <build>
121
Matthias Andreas Benkard545aeb62020-12-06 15:16:22 +0100122 <resources>
123 <resource>
124 <directory>src/main/resources</directory>
125 </resource>
126 </resources>
127
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +0200128 <!--
129 Der Beispielkorpus liegt unter src/test/resources, wird aber von den Tests über
130 Dateisystempfade gelesen, nicht über den Klassenpfad. Eine Kopie nach
131 target/test-classes wäre deshalb bei jedem Bau 35 MB umsonst.
132 -->
133 <testResources>
134 <testResource>
135 <directory>src/test/resources</directory>
136 <excludes>
137 <exclude>sampledata/**</exclude>
138 </excludes>
139 </testResource>
140 </testResources>
141
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100142 <pluginManagement>
143 <plugins>
144
145 <plugin>
146 <groupId>org.codehaus.mojo</groupId>
147 <artifactId>versions-maven-plugin</artifactId>
148 <configuration>
149 <generateBackupPoms>false</generateBackupPoms>
150 </configuration>
151 </plugin>
152
153 </plugins>
154 </pluginManagement>
155
156 <plugins>
157
158 <!-- Compiler -->
159 <plugin>
160 <artifactId>maven-compiler-plugin</artifactId>
161 <version>${compiler-plugin.version}</version>
Matthias Andreas Benkardc7f11362020-11-22 15:01:07 +0100162 <configuration>
163 <annotationProcessorPaths>
164 <path>
165 <groupId>info.picocli</groupId>
166 <artifactId>picocli-codegen</artifactId>
167 <version>${picocli.version}</version>
168 </path>
169 </annotationProcessorPaths>
170 <compilerArgs>
171 <arg>-Aproject=${project.groupId}/${project.artifactId}</arg>
172 </compilerArgs>
173 </configuration>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100174 </plugin>
175
176 <!-- Resources -->
177 <plugin>
178 <artifactId>maven-resources-plugin</artifactId>
179 <version>${resources-plugin.version}</version>
180 </plugin>
181
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +0200182 <!-- Tests -->
183 <plugin>
184 <artifactId>maven-surefire-plugin</artifactId>
185 <version>${surefire-plugin.version}</version>
186 </plugin>
187
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100188 <!-- Google Java Code Formatter, for enforcing style conventions -->
189 <plugin>
190 <groupId>com.diffplug.spotless</groupId>
191 <artifactId>spotless-maven-plugin</artifactId>
192 <version>${spotless-plugin.version}</version>
193 <configuration>
194 <java>
195 <removeUnusedImports/>
196 <importOrder>
197 <order>java,javax,org,com,de,io,dagger,eu.mulk,</order>
198 </importOrder>
199 <googleJavaFormat>
200 <version>${google.java.format.version}</version>
201 <style>GOOGLE</style>
202 </googleJavaFormat>
203 </java>
204 </configuration>
205 </plugin>
206
207 <plugin>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100208 <groupId>org.apache.maven.plugins</groupId>
209 <artifactId>maven-enforcer-plugin</artifactId>
210 <version>${enforcer-plugin.version}</version>
211 <executions>
212 <execution>
213 <id>enforce-maven</id>
214 <goals>
215 <goal>enforce</goal>
216 </goals>
217 <configuration>
218 <rules>
219 <requireMavenVersion>
220 <version>${enforced.maven-version}</version>
221 </requireMavenVersion>
222 </rules>
223 </configuration>
224 </execution>
225 </executions>
226 </plugin>
227
228 <plugin>
229 <groupId>org.codehaus.mojo</groupId>
230 <artifactId>exec-maven-plugin</artifactId>
231 <version>${exec-plugin.version}</version>
232 <configuration>
233 <mainClass>eu.mulk.aendggner.AendGgner</mainClass>
234 </configuration>
235 </plugin>
236
237 <plugin>
238 <groupId>org.apache.maven.plugins</groupId>
Matthias Andreas Benkardc7f11362020-11-22 15:01:07 +0100239 <artifactId>maven-dependency-plugin</artifactId>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +0200240 <version>${dependency-plugin.version}</version>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100241 <executions>
242 <execution>
Matthias Andreas Benkardc7f11362020-11-22 15:01:07 +0100243 <id>copy-dependencies</id>
244 <phase>prepare-package</phase>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100245 <goals>
Matthias Andreas Benkardc7f11362020-11-22 15:01:07 +0100246 <goal>copy-dependencies</goal>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100247 </goals>
248 <configuration>
Matthias Andreas Benkardc7f11362020-11-22 15:01:07 +0100249 <outputDirectory>
250 ${project.build.directory}/libs
251 </outputDirectory>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +0200252 <includeScope>runtime</includeScope>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100253 </configuration>
254 </execution>
255 </executions>
256 </plugin>
257
Matthias Andreas Benkardc7f11362020-11-22 15:01:07 +0100258 <plugin>
259 <groupId>org.apache.maven.plugins</groupId>
260 <artifactId>maven-jar-plugin</artifactId>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +0200261 <version>${jar-plugin.version}</version>
Matthias Andreas Benkardc7f11362020-11-22 15:01:07 +0100262 <configuration>
263 <archive>
264 <manifest>
265 <addClasspath>true</addClasspath>
266 <classpathPrefix>libs/</classpathPrefix>
267 <mainClass>
268 eu.mulk.aendggner.AendGgner
269 </mainClass>
270 </manifest>
271 </archive>
272 </configuration>
273 </plugin>
274
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100275 </plugins>
276
277 </build>
278
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +0200279 <profiles>
280
281 <!--
282 Browserfassung: übersetzt dieselbe Pipeline mit GraalVM Web Image nach WebAssembly.
283 Ausdrücklich anzufordern (`-Pwasm`); der Standard-Build bleibt unberührt und braucht
284 kein GraalVM.
285
286 Voraussetzung: Oracle GraalVM 25.1+ (Web Image ist dort enthalten, in der CE nicht):
287
288 JAVA_HOME=/pfad/zu/oracle-graalvm ./mvnw -Pwasm package
289
290 Ergebnis: target/web/ — aendggner.js, aendggner.js.wasm und die statischen Seiten.
291 -->
292 <profile>
293 <id>wasm</id>
294
295 <properties>
296 <native-image.executable>${java.home}/bin/native-image</native-image.executable>
297 <wasm.output.directory>${project.build.directory}/web</wasm.output.directory>
298 <!--
299 Die Option „release 21“ beschränkte den Modulpfad auf die dokumentierte JDK-API; die
300 Web-Image-API des GraalVM wäre damit unsichtbar. Deshalb hier source/target statt
301 release — übersetzt wird ohnehin nur mit dem GraalVM, gegen dessen eigene Klassen.
302 -->
303 <maven.compiler.release/>
304 <maven.compiler.source>21</maven.compiler.source>
305 <maven.compiler.target>21</maven.compiler.target>
306 </properties>
307
308 <dependencies>
309 <!--
310 Reines Java-zlib. Web Image bindet die nativen zlib-Funktionen des JDK nicht an
311 (GR-65205); ohne Inflate ist kein PDF lesbar. Siehe
312 src/wasm/java/.../InflaterErsatz.java.
313 -->
314 <dependency>
315 <groupId>org.jruby</groupId>
316 <artifactId>jzlib</artifactId>
317 <version>${jzlib.version}</version>
318 </dependency>
319 </dependencies>
320
321 <build>
322 <plugins>
323
324 <!-- Der Wasm-Quellbaum kommt nur in diesem Profil hinzu: Er braucht die
325 Web-Image-API und svm.jar, die es nur im GraalVM gibt. -->
326 <plugin>
327 <groupId>org.codehaus.mojo</groupId>
328 <artifactId>build-helper-maven-plugin</artifactId>
329 <version>${build-helper-plugin.version}</version>
330 <executions>
331 <execution>
332 <id>wasm-quellen</id>
333 <phase>generate-sources</phase>
334 <goals>
335 <goal>add-source</goal>
336 </goals>
337 <configuration>
338 <sources>
339 <source>src/wasm/java</source>
340 </sources>
341 </configuration>
342 </execution>
343 </executions>
344 </plugin>
345
346 <plugin>
347 <artifactId>maven-compiler-plugin</artifactId>
348 <configuration>
349 <compilerArgs>
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +0200350 <arg>--add-modules</arg>
351 <arg>org.graalvm.webimage.api</arg>
352 </compilerArgs>
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +0200353 <!--
354 Ohne Picocli-Annotationsprozessor: Er meldet die Befehlszeilenklasse
355 eu.mulk.aendggner.AendGgner mit „allDeclaredMethods“ zur Reflexion an, und
356 die Erreichbarkeitsanalyse zieht daraufhin die gesamte Befehlszeilenfassung
357 samt Picocli und den Dateizugriffen ins Browser-Image, obwohl BrowserMain
358 nichts davon anfasst. Im Browser gibt es keine Befehlszeile.
359 -->
360 <proc>none</proc>
361 <annotationProcessorPaths/>
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +0200362 </configuration>
363 </plugin>
364
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +0200365 <!--
366 Ein vorangegangener gewöhnlicher Bau hat die Picocli-Konfiguration womöglich
367 schon nach target/classes gelegt; native-image liest sie von dort auch dann,
368 wenn dieser Bau sie nicht mehr erzeugt. Also fort damit, sonst hinge die
369 Bildgröße davon ab, was vorher lief.
370 -->
371 <plugin>
372 <artifactId>maven-clean-plugin</artifactId>
373 <version>${clean-plugin.version}</version>
374 <executions>
375 <execution>
376 <id>picocli-konfiguration-fort</id>
377 <phase>prepare-package</phase>
378 <goals>
379 <goal>clean</goal>
380 </goals>
381 <configuration>
382 <excludeDefaultDirectories>true</excludeDefaultDirectories>
383 <filesets>
384 <fileset>
385 <directory>
386 ${project.build.outputDirectory}/META-INF/native-image/picocli-generated
387 </directory>
388 </fileset>
389 </filesets>
390 </configuration>
391 </execution>
392 </executions>
393 </plugin>
394
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +0200395 <plugin>
396 <artifactId>maven-resources-plugin</artifactId>
397 <executions>
398 <execution>
399 <id>statische-seiten</id>
400 <phase>package</phase>
401 <goals>
402 <goal>copy-resources</goal>
403 </goals>
404 <configuration>
405 <outputDirectory>${wasm.output.directory}</outputDirectory>
406 <resources>
407 <resource>
408 <directory>src/main/resources/eu/mulk/aendggner/web</directory>
409 </resource>
410 </resources>
411 </configuration>
412 </execution>
413 </executions>
414 </plugin>
415
416 <plugin>
417 <groupId>org.codehaus.mojo</groupId>
418 <artifactId>exec-maven-plugin</artifactId>
419 <executions>
420 <execution>
421 <id>web-image</id>
422 <phase>package</phase>
423 <goals>
424 <goal>exec</goal>
425 </goals>
426 <configuration>
427 <executable>${native-image.executable}</executable>
428 <arguments>
429 <argument>--tool:svm-wasm</argument>
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +0200430 <!-- Größe vor Durchsatz: Das Modul muss über die Leitung, und die
431 Rechenzeit einer Synopse liegt ohnehin im Sekundenbereich. -->
432 <argument>-Os</argument>
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +0200433 <!-- Der Textzwischenschritt (aendggner.js.wat) wird sonst mehrere hundert
434 Megabyte groß; auf die Größe des .wasm hat das keinen Einfluss. -->
435 <argument>-H:WasmComments=NONE</argument>
436 <argument>-classpath</argument>
437 <classpath/>
438 <argument>-o</argument>
439 <argument>${wasm.output.directory}/aendggner</argument>
440 <argument>eu.mulk.aendggner.wasm.BrowserMain</argument>
441 </arguments>
442 </configuration>
443 </execution>
Matthias Andreas Benkard2d33bf72026-08-16 06:40:07 +0200444
445 <!--
446 Macht aus dem Übersetzerergebnis ein auslieferbares Verzeichnis: entfernt den
447 .wat-Zwischenschritt, legt den Quelltext der gebauten Fassung bei (AGPLv3 §13)
448 und komprimiert vor. Läuft in derselben Phase, aber nach „web-image“ — Maven
449 führt gleichphasige Ausführungen in Deklarationsreihenfolge aus.
450 -->
451 <execution>
452 <id>webpaket</id>
453 <phase>package</phase>
454 <goals>
455 <goal>exec</goal>
456 </goals>
457 <configuration>
458 <executable>${project.basedir}/deploy/webpaket.sh</executable>
459 <arguments>
460 <argument>${wasm.output.directory}</argument>
461 </arguments>
462 </configuration>
463 </execution>
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +0200464 </executions>
465 </plugin>
466
467 </plugins>
468 </build>
469 </profile>
470
471 </profiles>
472
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100473</project>