Dit document bevat informatie die nodig is om aan de slag te gaan met verdere ontwikkeling van Klukkluk, en bevat instructies over het opzetten van de werkomgeving en informatie over libraries die gebruikt zijn om de applicatie te ontwikkelen.
Java
Voor het ontwikkelen van de applicatie is Java 17 vereist, evenals de JavaFX 17 SDK. Configuratie van Java staat in de installatiehandleiding beschreven.
Git
todo
Het klonen van de repository
De project-repository wordt door projectgroep ENIAC aangeleverd
Het opstellen van het project
Om aan de slag te kunnen met Klukkluk dient men de volgende stappen te doorlopen:
- Voeg het project toe aan git via git clone <repo>.
- Start IntelliJ.
- Open de pom.xml als project en laad alle dependencies.
- Zoek in de repository het bestand JaVaFo.jar. Druk met de rechtermuisknop hierop en klik op "Add as library", druk in het pop-upmenu op "ok".
- Controleer in module-info.java of van de twee regels die JaVaFo bevatten, degene onder de system scope in gebruik is. Dit staat in het bestand met comments aangegeven. Zie hoofdstuk 8 voor verdere toelichting.
- Controleer in de pom.xml of bij de JaVaFo dependency de system scope met bijbehorende filepath aanwezig zijn.
- Run Mainwrapper.class of KlukklukApplication.class om de applicatie te compileren. De applicatie zal nu opstarten.
Als de applicatie opstart zal deze een aantal waarschuwingen naar de console printen:
Deze hinderen de werking van het programma niet en kunnen genegeerd worden.
Projectstructuur
De package-structuur van de applicatie staat beschreven in het SDD. Hiernaast bevat de repository nog een aantal extra bestanden waarmee verder gewerkt kan worden.
- CREATE.sql, het script waarmee de database aangemaakt kan worden. Mochten er ooit aanpassingen moeten plaatsvinden in de database, dan kunnen die via dit bestand ingevoerd worden. (Zorg er naderhand voor dat de Entity-klassen bijgewerkt worden)
- JaVaFo.jar, De externe library gebruikt voor de indelingen voor periodecompetities via zwitsers. Hierover later nog meer informatie.
JPA
Voor verbinding met de database maakt Klukkluk gebruik van de Jakarta Persistence API. Om data uit de database te benaderen dient gebruik te worden gemaakt van de Repository en Entity-klassen, waarbij de repositories de functie van een DAO uitvoeren en een Entity een java-klasse is die een database tabel representeert. In de repositories kunnen queries op de database uitgevoerd worden in een speciaal dialect genaamd JPQL (Jakarta Persistence Query Language). Het resultaat van een query is altijd ofwel één ofwel een List van Entities. Deze entities kunnen vervolgens via mappers omgezet worden naar DTO's.
Indien er ooit een verandering aan de database moet worden doorgevoerd dienen de Entity-klassen mee aangepast te worden. Evenals als er ooit een nieuwe tabel wordt ingevoerd dient deze een corresponderende Entity-klasse te krijgen en toegevoegd te worden aan het persistence.xml bestand dat staat opgeslagen onder resources/META-INF.
module-info.java gebruiken
Klukkluk maakt gebruik van Java-modules. Deze worden gedefinieerd in het bestand module-info.java, waarin beschreven staat welke modules vereist zijn voor de werking van de applicatie, welke modules geopend worden, waarnaartoe deze worden geopend (indien toepasselijk) en welke modules geëxporteerd worden (en waarnaartoe indien van toepassing).
Voor versie 0.4 ziet het bestand er als volgt uit:
Bepaalde modules zijn verplicht naar de JavaFX module geëxporteerd te worden, zodat deze kunnen worden gebruikt met de JavaFX frontend, hierover later meer informatie.
Belangrijk, binnen de repository-klassen wordt gebruik gemaakt van Jakarta Persistence functies. Deze worden door IntelliJ rood aangegeven, IntelliJ wil deze immers van de jakarta.jakartaee.api module uitlezen. Deze functies worden al uitgelezen uit aanwezige modules. Het toevoegen van de jakarta.jakartaee.api module zorgt ervoor dat de applicatie niet zal builden.
JaVaFo
In het bestand zijn twee verschillende variaties van JaVaFo aanwezig. Welke van de twee van toepassing is hangt af van de manier waarop het project gepackaged wordt. Gedurende de ontwikkelingsperiode is gebruik gemaakt van online tooling om de codekwaliteit en stabiliteit van de builds te controleren, hiervoor moest JaVaFo in de system scope gedefinieerd worden, zodat de tooling deze via de Bitbucket repository kon inladen. Wanneer de applicatie via mvn package of mvn clean package wordt gepackaged dient gebruik te worden gemaakt van een local maven dependency via mvn install:install-file.
Om de dependency lokaal te installeren dienen de instructies in de comments van module-info.java gevolgd te worden. Hierna kunnen de JaVaFo modules omgewisseld worden en kan in pom.xml de system scope en filepath uitgecomment worden. Voor een lokale maven dependency zijn deze immers niet van toepassing.
JavaFX
tekst
Packaging via Maven
Klukkluk is een maven project, hierdoor kan de applicatie gemakkelijk gepackaged worden als een enkele .jar. Dit gebeurt door middel van de Maven Shade plugin:
De configuratie gebruikt door Klukkluk is vrij standaard en hoeft verder niet gewijzigd te worden.
De Maven Shade plugin haakt direct in de gebruikelijke maven commando's, de applicatie kan dus via mvn (clean) package gepackaged worden. Na het uitvoeren van dit commando worden er twee .jar bestanden gegenereerd: een original versie van de .jar (original-klukkluk-0.X.jar), en een zogeheten shaded .jar, genaamd klukkluk-0.X.jar. De shaded .jar bevat alle maven dependencies die nodig zijn om Klukkluk op te starten, waaronder alle onderdelen van JavaFX voor de front end van de applicatie. De original .jar heeft dit niet en zal dus niet opstarten. Deze .jar runnen via java -jar .\original-klukkluk-0.X.jar zal in de opdrachtprompt of terminal de volgende error geven:
Noot: Het betreft een ClassNotFoundException, deze wordt veroorzaakt door het ontbreken van module javafx.application.Application. Een klasse vereist door JavaFX om de applicatie te kunnen starten.
jpackage
Om de applicatie als een .msi te packagen kan gebruik worden gemaakt van jpackage. Jpackage werkt via een command line die in de Windows Opdrachtprompt of MacOS Terminal kan worden uitgevoerd. Dit ziet er als volgt uit:
jpackage --name Klukkluk --input "<path\to\main\jar\directory>" --type "msi" --app-version "0.X" --main-jar "klukkluk-0.X.jar" --win-dir-chooser --dest "<path\to\destination>" --win-shortcut --icon "<path\to\klukkluk.ico>"
In dit voorbeeld zitten een aantal opties, die naar wens kunnen worden ingesteld:
- --name: De naam van het bestand.
- --input: Het absolute pad waar de te packagen .jar staat. (Alleen de .jar mag hierin staan!)
- --dest: Het absolute pad waar de het te maken bestand wordt opgeslagen. (Deze kan leeggelaten worden, het bestand wordt in dit geval in de input directory opgeslagen)
- --type: Het type bestand om te packagen. (Let op: Dit is OS-specifiek! Een MacOS systeem mag geen .exe of .msi packagen, en een Windows systeem mag geen .pkg of .dmg aanmaken!)
- --app-version: De versie van de applicatie.
- --main-jar: de .jar die in het bestand verwerkt wordt.
- --icon: Het absolute pad naar het bestand wat als icoon voor het programma gebruikt wordt.
(Optioneel, OS-Specifiek)
- --win-dir-chooser: Geeft de gebruiker de mogelijkheid om te kiezen waar deze de applicatie wil installeren.
- --win-shortcut: maakt een snelkoppeling aan op het bureaublad.
Meer informatie over jpackage, samen met meer OS-specifieke opties, is te vinden in de documentatie van Oracle.