Java — Maven & Gradle
findsl codegen examples/kst -l java -o out/javaWas entsteht
Abschnitt betitelt „Was entsteht“- Pro
.findsl-Modul ein Interface plus eine Impl-Klasse; der Package-Pfad spiegelt das Verzeichnis (examples/kst/grundtarif.findsl→kst/Grundtarif.java+kst/GrundtarifImpl.java). datensatz→record,aufzählung→enum,konst→public static final.- Die Laufzeit unter
org/findsl/runtime/*.java— reines JDK, keine externen Dependencies.
Das Ergebnis ist ein autonomes Java-Projekt: Es gibt kein findsl-runtime-JAR aus Maven Central. Die Laufzeit-Quellen liegen im Source-Tree und werden einfach mitkompiliert.
Einbinden
Abschnitt betitelt „Einbinden“Das Generat sind reine Quelldateien ohne externe Abhängigkeit — du brauchst keinen <dependency>- bzw. dependencies-Eintrag für eine FinDSL-Laufzeit. Statt findsl von Hand aufzurufen, koppelst du den Schritt an den Build: vor dem Kompilieren das Binary ausführen und sein Ausgabeverzeichnis als zusätzliche Quell-Wurzel einbinden.
Die folgenden Beispiele nehmen an, dass die .findsl-Module unter src/main/findsl liegen und das Generat in ein eigenes generated-sources-Verzeichnis geht (nicht in das handgeschriebene src/main/java). findsl muss im PATH sein.
exec-maven-plugin ruft das Binary in der generate-sources-Phase auf; build-helper-maven-plugin macht das Ausgabeverzeichnis zur Quell-Wurzel (pom.xml):
<build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.5.0</version> <executions> <execution> <id>findsl-codegen</id> <phase>generate-sources</phase> <goals><goal>exec</goal></goals> <configuration> <executable>findsl</executable> <arguments> <argument>codegen</argument> <argument>src/main/findsl</argument> <argument>-l</argument> <argument>java</argument> <argument>-o</argument> <argument>${project.build.directory}/generated-sources/findsl</argument> </arguments> </configuration> </execution> </executions> </plugin>
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>3.6.0</version> <executions> <execution> <id>findsl-add-source</id> <phase>generate-sources</phase> <goals><goal>add-source</goal></goals> <configuration> <sources> <source>${project.build.directory}/generated-sources/findsl</source> </sources> </configuration> </execution> </executions> </plugin> </plugins></build>mvn compile generiert nun automatisch und kompiliert das Generat (samt Laufzeit) mit. Für die JUnit-5-Tests aus den prüfe-Blöcken eine zweite Ausführung mit -t … && build-helper:add-test-source analog ergänzen.
Ein Exec-Task generiert vor compileJava; das Ausgabeverzeichnis wird als zusätzliches Quellverzeichnis registriert (build.gradle.kts):
val generateFindsl by tasks.registering(Exec::class) { val outDir = layout.buildDirectory.dir("generated/findsl/java") outputs.dir(outDir) commandLine( "findsl", "codegen", "src/main/findsl", "-l", "java", "-o", outDir.get().asFile.absolutePath, )}
sourceSets.main { java.srcDir(layout.buildDirectory.dir("generated/findsl/java"))}
tasks.compileJava { dependsOn(generateFindsl)}./gradlew build löst die Generierung automatisch vor dem Kompilieren aus.
Direkt generieren und kompilieren:
findsl codegen src/main/findsl -l java -o build/findsljavac -d build/classes $(find build/findsl -name '*.java')Tests mitgenerieren
Abschnitt betitelt „Tests mitgenerieren“Die prüfe-Blöcke werden zu JUnit-5-Tests — bit-genau gegen den Referenz-Interpreter. Mit -t in ein eigenes Testverzeichnis:
findsl codegen src/main/findsl -l java -o out/java -t out/testmvn test # bzw. ./gradlew testEigenschaften
Abschnitt betitelt „Eigenschaften“Air-gapped, Lockstep, auditierbar, idempotent — siehe Überblick.