blob: d09c55288007a686f17fbb4f51d2d244ead488eb [file] [log] [blame]
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +01001<?xml version="1.0"?>
Matthias Andreas Benkard279fca62026-08-23 08:32:08 +02002<!-- SPDX-FileCopyrightText: 2020 Matthias Andreas Benkard <code@mail.matthias.benkard.de>
3 SPDX-License-Identifier: AGPL-3.0-or-later -->
Matthias Andreas Benkard545aeb62020-12-06 15:16:22 +01004<project
5 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
6 xmlns="http://maven.apache.org/POM/4.0.0"
7 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +01008
9 <modelVersion>4.0.0</modelVersion>
10
11 <groupId>eu.mulk</groupId>
12 <artifactId>aendggner</artifactId>
13 <version>${revision}</version>
14
Matthias Andreas Benkardd10ce7c2026-08-23 08:32:31 +020015 <licenses>
16 <license>
17 <name>AGPL-3.0-or-later</name>
18 <url>https://www.gnu.org/licenses/agpl-3.0.html</url>
19 <distribution>repo</distribution>
20 <comments>Wortlaut im Quelltext unter LICENSES/AGPL-3.0-or-later.txt (COPYING).</comments>
21 </license>
22 </licenses>
23
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010024 <properties>
25 <maven.compiler.parameters>true</maven.compiler.parameters>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +020026 <maven.compiler.release>21</maven.compiler.release>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010027
28 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
29 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
30
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +020031 <enforced.maven-version>3.9.0</enforced.maven-version>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010032
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +020033 <build-helper-plugin.version>3.6.0</build-helper-plugin.version>
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +020034 <clean-plugin.version>3.3.2</clean-plugin.version>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +020035 <compiler-plugin.version>3.15.0</compiler-plugin.version>
36 <dependency-plugin.version>3.11.0</dependency-plugin.version>
37 <enforcer-plugin.version>3.6.3</enforcer-plugin.version>
38 <exec-plugin.version>3.6.3</exec-plugin.version>
39 <jar-plugin.version>3.5.0</jar-plugin.version>
40 <resources-plugin.version>3.5.0</resources-plugin.version>
41 <spotless-plugin.version>3.8.0</spotless-plugin.version>
42 <surefire-plugin.version>3.5.6</surefire-plugin.version>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010043
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +020044 <google.java.format.version>1.28.0</google.java.format.version>
45
46 <assertj.version>3.27.7</assertj.version>
47 <java-diff-utils.version>4.17</java-diff-utils.version>
48 <jboss-logging.version>3.6.3.Final</jboss-logging.version>
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +020049 <jzlib.version>1.1.5</jzlib.version>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +020050 <jspecify.version>1.0.0</jspecify.version>
51 <junit.version>5.13.4</junit.version>
52 <pdfbox.version>3.0.8</pdfbox.version>
53 <picocli.version>4.7.7</picocli.version>
54 <slf4j.version>2.0.18</slf4j.version>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010055 </properties>
56
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +020057 <dependencyManagement>
58 <dependencies>
59 <dependency>
60 <groupId>org.junit</groupId>
61 <artifactId>junit-bom</artifactId>
62 <version>${junit.version}</version>
63 <type>pom</type>
64 <scope>import</scope>
65 </dependency>
66 </dependencies>
67 </dependencyManagement>
68
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010069 <dependencies>
70
71 <!-- Annotations -->
72 <dependency>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +020073 <groupId>org.jspecify</groupId>
74 <artifactId>jspecify</artifactId>
75 <version>${jspecify.version}</version>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010076 </dependency>
77
Matthias Andreas Benkard31a2c502020-11-22 14:36:27 +010078 <!-- Command line parsing -->
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +010079 <dependency>
80 <groupId>info.picocli</groupId>
81 <artifactId>picocli</artifactId>
82 <version>${picocli.version}</version>
83 </dependency>
84
Matthias Andreas Benkard545aeb62020-12-06 15:16:22 +010085 <!-- Logging -->
86 <dependency>
87 <groupId>org.jboss.logging</groupId>
88 <artifactId>jboss-logging</artifactId>
89 <version>${jboss-logging.version}</version>
90 </dependency>
Matthias Andreas Benkard545aeb62020-12-06 15:16:22 +010091 <dependency>
92 <groupId>org.slf4j</groupId>
93 <artifactId>slf4j-jdk14</artifactId>
94 <version>${slf4j.version}</version>
95 </dependency>
96 <dependency>
97 <groupId>org.slf4j</groupId>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +020098 <artifactId>jcl-over-slf4j</artifactId>
Matthias Andreas Benkard545aeb62020-12-06 15:16:22 +010099 <version>${slf4j.version}</version>
100 </dependency>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +0200101
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +0200102 <!-- PDF text extraction -->
Matthias Andreas Benkard31a2c502020-11-22 14:36:27 +0100103 <dependency>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +0200104 <groupId>org.apache.pdfbox</groupId>
105 <artifactId>pdfbox</artifactId>
106 <version>${pdfbox.version}</version>
107 </dependency>
108
109 <!-- Text diffing -->
110 <dependency>
111 <groupId>io.github.java-diff-utils</groupId>
112 <artifactId>java-diff-utils</artifactId>
113 <version>${java-diff-utils.version}</version>
114 </dependency>
115
116 <!-- Testing -->
117 <dependency>
118 <groupId>org.junit.jupiter</groupId>
119 <artifactId>junit-jupiter</artifactId>
120 <scope>test</scope>
Matthias Andreas Benkard31a2c502020-11-22 14:36:27 +0100121 </dependency>
122 <dependency>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +0200123 <groupId>org.assertj</groupId>
124 <artifactId>assertj-core</artifactId>
125 <version>${assertj.version}</version>
126 <scope>test</scope>
Matthias Andreas Benkard31a2c502020-11-22 14:36:27 +0100127 </dependency>
128
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100129 </dependencies>
130
131 <build>
132
Matthias Andreas Benkard545aeb62020-12-06 15:16:22 +0100133 <resources>
134 <resource>
135 <directory>src/main/resources</directory>
136 </resource>
137 </resources>
138
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +0200139 <!--
140 Der Beispielkorpus liegt unter src/test/resources, wird aber von den Tests über
141 Dateisystempfade gelesen, nicht über den Klassenpfad. Eine Kopie nach
142 target/test-classes wäre deshalb bei jedem Bau 35 MB umsonst.
143 -->
144 <testResources>
145 <testResource>
146 <directory>src/test/resources</directory>
147 <excludes>
148 <exclude>sampledata/**</exclude>
149 </excludes>
150 </testResource>
151 </testResources>
152
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100153 <pluginManagement>
154 <plugins>
155
156 <plugin>
157 <groupId>org.codehaus.mojo</groupId>
158 <artifactId>versions-maven-plugin</artifactId>
159 <configuration>
160 <generateBackupPoms>false</generateBackupPoms>
161 </configuration>
162 </plugin>
163
164 </plugins>
165 </pluginManagement>
166
167 <plugins>
168
169 <!-- Compiler -->
170 <plugin>
171 <artifactId>maven-compiler-plugin</artifactId>
172 <version>${compiler-plugin.version}</version>
Matthias Andreas Benkardc7f11362020-11-22 15:01:07 +0100173 <configuration>
174 <annotationProcessorPaths>
175 <path>
176 <groupId>info.picocli</groupId>
177 <artifactId>picocli-codegen</artifactId>
178 <version>${picocli.version}</version>
179 </path>
180 </annotationProcessorPaths>
181 <compilerArgs>
182 <arg>-Aproject=${project.groupId}/${project.artifactId}</arg>
183 </compilerArgs>
184 </configuration>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100185 </plugin>
186
187 <!-- Resources -->
188 <plugin>
189 <artifactId>maven-resources-plugin</artifactId>
190 <version>${resources-plugin.version}</version>
191 </plugin>
192
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +0200193 <!-- Tests -->
194 <plugin>
195 <artifactId>maven-surefire-plugin</artifactId>
196 <version>${surefire-plugin.version}</version>
197 </plugin>
198
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100199 <!-- Google Java Code Formatter, for enforcing style conventions -->
200 <plugin>
201 <groupId>com.diffplug.spotless</groupId>
202 <artifactId>spotless-maven-plugin</artifactId>
203 <version>${spotless-plugin.version}</version>
204 <configuration>
205 <java>
Matthias Andreas Benkard279fca62026-08-23 08:32:08 +0200206 <!-- src/wasm/java tritt dem Quellbaum erst im Profil -Pwasm bei; damit die
207 beiden Wasm-Klassen dennoch stets mitgeprüft werden, sind die
208 Quellverzeichnisse hier ausdrücklich benannt. -->
209 <includes>
210 <include>src/*/java/**/*.java</include>
211 </includes>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100212 <removeUnusedImports/>
213 <importOrder>
214 <order>java,javax,org,com,de,io,dagger,eu.mulk,</order>
215 </importOrder>
216 <googleJavaFormat>
217 <version>${google.java.format.version}</version>
218 <style>GOOGLE</style>
219 </googleJavaFormat>
Matthias Andreas Benkard279fca62026-08-23 08:32:08 +0200220 <licenseHeader>
221 <content><![CDATA[// SPDX-FileCopyrightText: 2020 Matthias Andreas Benkard <code@mail.matthias.benkard.de>
222// SPDX-License-Identifier: AGPL-3.0-or-later
223
224]]></content>
225 </licenseHeader>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100226 </java>
227 </configuration>
Matthias Andreas Benkardd10ce7c2026-08-23 08:32:31 +0200228 <executions>
229 <!-- Hält den Bau an, sobald eine Quelldatei ohne SPDX-Kopfzeile oder ohne
230 die vereinbarte Formatierung hinzukommt. -->
231 <execution>
232 <id>spotless-check</id>
233 <phase>verify</phase>
234 <goals>
235 <goal>check</goal>
236 </goals>
237 </execution>
238 </executions>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100239 </plugin>
240
241 <plugin>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100242 <groupId>org.apache.maven.plugins</groupId>
243 <artifactId>maven-enforcer-plugin</artifactId>
244 <version>${enforcer-plugin.version}</version>
245 <executions>
246 <execution>
247 <id>enforce-maven</id>
248 <goals>
249 <goal>enforce</goal>
250 </goals>
251 <configuration>
252 <rules>
253 <requireMavenVersion>
254 <version>${enforced.maven-version}</version>
255 </requireMavenVersion>
256 </rules>
257 </configuration>
258 </execution>
259 </executions>
260 </plugin>
261
262 <plugin>
263 <groupId>org.codehaus.mojo</groupId>
264 <artifactId>exec-maven-plugin</artifactId>
265 <version>${exec-plugin.version}</version>
266 <configuration>
267 <mainClass>eu.mulk.aendggner.AendGgner</mainClass>
268 </configuration>
269 </plugin>
270
271 <plugin>
272 <groupId>org.apache.maven.plugins</groupId>
Matthias Andreas Benkardc7f11362020-11-22 15:01:07 +0100273 <artifactId>maven-dependency-plugin</artifactId>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +0200274 <version>${dependency-plugin.version}</version>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100275 <executions>
276 <execution>
Matthias Andreas Benkardc7f11362020-11-22 15:01:07 +0100277 <id>copy-dependencies</id>
278 <phase>prepare-package</phase>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100279 <goals>
Matthias Andreas Benkardc7f11362020-11-22 15:01:07 +0100280 <goal>copy-dependencies</goal>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100281 </goals>
282 <configuration>
Matthias Andreas Benkardc7f11362020-11-22 15:01:07 +0100283 <outputDirectory>
284 ${project.build.directory}/libs
285 </outputDirectory>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +0200286 <includeScope>runtime</includeScope>
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100287 </configuration>
288 </execution>
289 </executions>
290 </plugin>
291
Matthias Andreas Benkardc7f11362020-11-22 15:01:07 +0100292 <plugin>
293 <groupId>org.apache.maven.plugins</groupId>
294 <artifactId>maven-jar-plugin</artifactId>
Matthias Andreas Benkard1b9bfb12026-07-13 07:08:31 +0200295 <version>${jar-plugin.version}</version>
Matthias Andreas Benkardc7f11362020-11-22 15:01:07 +0100296 <configuration>
297 <archive>
298 <manifest>
299 <addClasspath>true</addClasspath>
300 <classpathPrefix>libs/</classpathPrefix>
301 <mainClass>
302 eu.mulk.aendggner.AendGgner
303 </mainClass>
304 </manifest>
305 </archive>
306 </configuration>
307 </plugin>
308
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100309 </plugins>
310
311 </build>
312
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +0200313 <profiles>
314
315 <!--
316 Browserfassung: übersetzt dieselbe Pipeline mit GraalVM Web Image nach WebAssembly.
317 Ausdrücklich anzufordern (`-Pwasm`); der Standard-Build bleibt unberührt und braucht
318 kein GraalVM.
319
320 Voraussetzung: Oracle GraalVM 25.1+ (Web Image ist dort enthalten, in der CE nicht):
321
322 JAVA_HOME=/pfad/zu/oracle-graalvm ./mvnw -Pwasm package
323
324 Ergebnis: target/web/ — aendggner.js, aendggner.js.wasm und die statischen Seiten.
325 -->
326 <profile>
327 <id>wasm</id>
328
329 <properties>
330 <native-image.executable>${java.home}/bin/native-image</native-image.executable>
331 <wasm.output.directory>${project.build.directory}/web</wasm.output.directory>
332 <!--
333 Die Option „release 21“ beschränkte den Modulpfad auf die dokumentierte JDK-API; die
334 Web-Image-API des GraalVM wäre damit unsichtbar. Deshalb hier source/target statt
335 release — übersetzt wird ohnehin nur mit dem GraalVM, gegen dessen eigene Klassen.
336 -->
337 <maven.compiler.release/>
338 <maven.compiler.source>21</maven.compiler.source>
339 <maven.compiler.target>21</maven.compiler.target>
340 </properties>
341
342 <dependencies>
343 <!--
344 Reines Java-zlib. Web Image bindet die nativen zlib-Funktionen des JDK nicht an
345 (GR-65205); ohne Inflate ist kein PDF lesbar. Siehe
346 src/wasm/java/.../InflaterErsatz.java.
347 -->
348 <dependency>
349 <groupId>org.jruby</groupId>
350 <artifactId>jzlib</artifactId>
351 <version>${jzlib.version}</version>
352 </dependency>
353 </dependencies>
354
355 <build>
356 <plugins>
357
358 <!-- Der Wasm-Quellbaum kommt nur in diesem Profil hinzu: Er braucht die
359 Web-Image-API und svm.jar, die es nur im GraalVM gibt. -->
360 <plugin>
361 <groupId>org.codehaus.mojo</groupId>
362 <artifactId>build-helper-maven-plugin</artifactId>
363 <version>${build-helper-plugin.version}</version>
364 <executions>
365 <execution>
366 <id>wasm-quellen</id>
367 <phase>generate-sources</phase>
368 <goals>
369 <goal>add-source</goal>
370 </goals>
371 <configuration>
372 <sources>
373 <source>src/wasm/java</source>
374 </sources>
375 </configuration>
376 </execution>
377 </executions>
378 </plugin>
379
380 <plugin>
381 <artifactId>maven-compiler-plugin</artifactId>
382 <configuration>
383 <compilerArgs>
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +0200384 <arg>--add-modules</arg>
385 <arg>org.graalvm.webimage.api</arg>
386 </compilerArgs>
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +0200387 <!--
388 Ohne Picocli-Annotationsprozessor: Er meldet die Befehlszeilenklasse
389 eu.mulk.aendggner.AendGgner mit „allDeclaredMethods“ zur Reflexion an, und
390 die Erreichbarkeitsanalyse zieht daraufhin die gesamte Befehlszeilenfassung
391 samt Picocli und den Dateizugriffen ins Browser-Image, obwohl BrowserMain
392 nichts davon anfasst. Im Browser gibt es keine Befehlszeile.
393 -->
394 <proc>none</proc>
395 <annotationProcessorPaths/>
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +0200396 </configuration>
397 </plugin>
398
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +0200399 <!--
400 Ein vorangegangener gewöhnlicher Bau hat die Picocli-Konfiguration womöglich
401 schon nach target/classes gelegt; native-image liest sie von dort auch dann,
402 wenn dieser Bau sie nicht mehr erzeugt. Also fort damit, sonst hinge die
403 Bildgröße davon ab, was vorher lief.
404 -->
405 <plugin>
406 <artifactId>maven-clean-plugin</artifactId>
407 <version>${clean-plugin.version}</version>
408 <executions>
409 <execution>
410 <id>picocli-konfiguration-fort</id>
411 <phase>prepare-package</phase>
412 <goals>
413 <goal>clean</goal>
414 </goals>
415 <configuration>
416 <excludeDefaultDirectories>true</excludeDefaultDirectories>
417 <filesets>
418 <fileset>
419 <directory>
420 ${project.build.outputDirectory}/META-INF/native-image/picocli-generated
421 </directory>
422 </fileset>
423 </filesets>
424 </configuration>
425 </execution>
426 </executions>
427 </plugin>
428
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +0200429 <plugin>
430 <artifactId>maven-resources-plugin</artifactId>
431 <executions>
432 <execution>
433 <id>statische-seiten</id>
434 <phase>package</phase>
435 <goals>
436 <goal>copy-resources</goal>
437 </goals>
438 <configuration>
439 <outputDirectory>${wasm.output.directory}</outputDirectory>
440 <resources>
441 <resource>
442 <directory>src/main/resources/eu/mulk/aendggner/web</directory>
443 </resource>
444 </resources>
445 </configuration>
446 </execution>
447 </executions>
448 </plugin>
449
450 <plugin>
451 <groupId>org.codehaus.mojo</groupId>
452 <artifactId>exec-maven-plugin</artifactId>
453 <executions>
454 <execution>
455 <id>web-image</id>
456 <phase>package</phase>
457 <goals>
458 <goal>exec</goal>
459 </goals>
460 <configuration>
461 <executable>${native-image.executable}</executable>
462 <arguments>
463 <argument>--tool:svm-wasm</argument>
Matthias Andreas Benkardf3b47af2026-08-22 21:23:06 +0200464 <!-- Größe vor Durchsatz: Das Modul muss über die Leitung, und die
465 Rechenzeit einer Synopse liegt ohnehin im Sekundenbereich. -->
466 <argument>-Os</argument>
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +0200467 <!-- Der Textzwischenschritt (aendggner.js.wat) wird sonst mehrere hundert
468 Megabyte groß; auf die Größe des .wasm hat das keinen Einfluss. -->
469 <argument>-H:WasmComments=NONE</argument>
470 <argument>-classpath</argument>
471 <classpath/>
472 <argument>-o</argument>
473 <argument>${wasm.output.directory}/aendggner</argument>
474 <argument>eu.mulk.aendggner.wasm.BrowserMain</argument>
475 </arguments>
476 </configuration>
477 </execution>
Matthias Andreas Benkard2d33bf72026-08-16 06:40:07 +0200478
479 <!--
480 Macht aus dem Übersetzerergebnis ein auslieferbares Verzeichnis: entfernt den
481 .wat-Zwischenschritt, legt den Quelltext der gebauten Fassung bei (AGPLv3 §13)
482 und komprimiert vor. Läuft in derselben Phase, aber nach „web-image“ — Maven
483 führt gleichphasige Ausführungen in Deklarationsreihenfolge aus.
484 -->
485 <execution>
486 <id>webpaket</id>
487 <phase>package</phase>
488 <goals>
489 <goal>exec</goal>
490 </goals>
491 <configuration>
492 <executable>${project.basedir}/deploy/webpaket.sh</executable>
493 <arguments>
494 <argument>${wasm.output.directory}</argument>
495 </arguments>
496 </configuration>
497 </execution>
Matthias Andreas Benkard2b1841e2026-08-15 10:51:11 +0200498 </executions>
499 </plugin>
500
501 </plugins>
502 </build>
503 </profile>
504
505 </profiles>
506
Matthias Andreas Benkardb291c362020-11-22 10:22:27 +0100507</project>