Commit 62f12f65 authored by Hallvard Trætteberg's avatar Hallvard Trætteberg
Browse files

Mer om maven

parent 5312a8fe
Pipeline #138341 passed with stages
in 2 minutes and 21 seconds
This diff is collapsed.
......@@ -6,9 +6,11 @@
link:slides/01-course-intro.html[Lysarkene] gir en oversikt over organiseringen av emnet
link:slides/02-git-plus-plus.html[Lysarkene] gir en oversikt over git, gitlab og gitpod
include::{sourcedir}/gitpod.adoc[leveloffset=+2]
link:slides/02-git-plus-plus.html[Lysarkene] gir en oversikt over git, gitlab og gitpod
include::{sourcedir}/ci.adoc[leveloffset=+2]
== 2020
......
......@@ -43,7 +43,7 @@ asciidoctorj {
diagram.version '1.5.16'
}
// useIntermediateWorkDir = true
attributes toc: 'left', toclevels: 4,
attributes toc: 'left', toclevels: 3,
'source-highlighter': 'highlightjs'
/*
......
......@@ -7,15 +7,6 @@
include::{includedir}header.adoc[]
== Kontinuerlig integrasjon (CI)
Automatisering av alt som fremmer kvalitet, men som tar tid, f.eks.
* kompilering og bygging av jar-filer (generelt avledete artifakter)
* kjøring av enhets- og integrasjonstester
* analyser av ulike typer kvalitet (formatering, kodingsstandarder, vanlige feil, ...)
* bygging av kjørbart system og kjøring av systemtester
== Smidig utfordring
[.smaller-60]
......@@ -30,6 +21,15 @@ Automatisering av alt som fremmer kvalitet, men som tar tid, f.eks.
** koden innen teamet - integrasjonstesting
** hele systemet - systemtesting (og evt. deployment)
== Kontinuerlig integrasjon (CI)
Automatisering av alt som fremmer kvalitet, men som tar tid, f.eks.
* kompilering og bygging av jar-filer (generelt avledete artifakter)
* kjøring av enhets- og integrasjonstester
* analyser av ulike typer kvalitet (formatering, kodingsstandarder, vanlige feil, ...)
* bygging av kjørbart system og kjøring av systemtester
== Smidig løsning
[.smaller-80]
......@@ -54,86 +54,56 @@ Automatisering av alt som fremmer kvalitet, men som tar tid, f.eks.
== Byggeverktøy forts.
[.smaller-60]
* to hovedalternativer: *gradle* og *maven*
* to hovedalternativer for Java er *gradle* og *maven*, andre språk har tilsvarende, f.eks. *yarn* for Javascript og *sbt* for Scala.
** litt ulik terminologi og logikk, men forskjellene er tildels overfladiske
** begge kan mye det samme, så valget er i stor grad pragmatisk (!)
** masse materiale å lære fra, uansett valg
* *maven*
** mer modent og strukturert, men også mer krevende og tungvint
** mer modent og strukturert, men oppfattes som noe mer krevende og tungvint
** sekvensierer byggetrinn basert på overordnede _faser_
* *gradle*
** konfigurerbare byggetrinn sekvensieres basert på avhengigheter
** konfig.filene (*settings.gradle* og *build.gradle*) er forståelige
== Enkelt prosjektoppsett
== Maven og pom.xml
[.smaller-60]
Enkle prosjekter består av én modul og mappe
* *pom.xml* konfigurerer bygg
** nødvendige biblioteker for kompilering, kjøring og testing
** versjon og konfigurasjon av maven-tillegg som trengs i bygget
** konfigurasjon av kompilering (java-versjon) og kjøring (hovedklasse)
* standardinnstillingene krever fire mapper for java
** *src/main/java* inneholder "produktiv" java-kode
** *src/main/resources* inneholder _ressurser_, f.eks. *fxml*- og *png*-filer
** *src/test/java* inneholder testkode
** *src/test/resources* inneholder ressurser spesifikke for testene, f.eks. datafiler
[.smaller-60]
* *settings.gradle* og *build.gradle* konfigurerer bygg
* *gradlew*/*gradlew.bat* og *gradle*-mappe må inkluderes
== https://gitlab.stud.idi.ntnu.no/it1901/javafx-template/-/tree/main/javafx-template[javafx-template]
[.smaller-60]
Eksempel:
Eksempel på én-modul-prosjekt i (i https://gitlab.stud.idi.ntnu.no/it1901/javafx-template[javafx-template-kodelageret])
[.smaller-60]
* desktop-app med javafx og fxml
* ikke noe behov for gjenbruk av kjernelogikk i andre prosjekter
== simpleexample
[.smaller]
[.left-60]
* eksempel på én-modul-prosjekt
** javafx+fxml-app
** standard mapper for java
** gradle-filer
* avhengigheter til biblioteker for javafx og jupiter (testing)
* velger spesifikke versjon av en del maven-tillegg
* Java 16 for kompilering (og kjøring)
* app.App er hovedklassen for kjøring med maven-tillegget for javafx
[.right]
image::../images/simpleexample-structure.png[width=300]
== simpleexample forts.
[.smaller]
* standard innhold i *build.gradle*
** plugins - tillegg som passer til typen prosjekt, f.eks.
** repositories - hvor finnes tillegg og bibliotek (jar-filer)
** dependencies - hvilke bibliotek brukes og til hva/når
* tillegg-spesifikk konfigurasjon, f.eks.
** oppstartsklasse for java
** javafx-versjon og -moduler som brukes
== simpleexample forts.
* build.gradle *plugins*
** application - java-app med main-metode, som kan pakkes som kjørbar jar
** org.openjfx.javafxplugin - javafx-app
[source]
----
plugins {
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.8'
}
----
image::../images/javafx-template-structure.png[width=300]
== Modulært prosjektoppsett
== https://gitlab.stud.idi.ntnu.no/it1901/javafx-template/-/tree/main/modules-template[modules-template]
[.smaller-60]
_Flermodul_-prosjekter har delmoduler i undermapper
[.smaller-60]
* *settings.gradle* i hovedmappa navngir hovedprosjektet og delmodulene
* *gradlew*/*gradlew.bat* og *gradle*-mappe må inkluderes i hovedmappa
* delmodulene (i undermappene) trenger (bare) egen *build.gradle*-fil
[.smaller-60]
Eksempel:
Eksempel på fler-modul-prosjekt
[.smaller-60]
* klient-tjener-app
* (noe) felles kjernelogikk i klient og tjener
* kan ha flere klienter, f.eks. desktop og mobil (og web)
[.left-60]
* to undermapper, *core* og *ui*, med hver sin *pom.xml*
** core har kode (og tester) for domeneklasser
** ui har GUI-kode med avhengigheter til JavaFX
** modulspesifikk konfigurasjon er i respektive *pom.xml*-filer
* *pom.xml* på toppnivå innholder
** avhengigheter som er felles for (under)modulene
** konfigurasjon av tillegg som brukes i (under)modulene
== Modularitet
......@@ -142,20 +112,21 @@ Eksempel:
** moduler er relativt selvstendige enheter
** eksplisitte avhengigheter mellom moduler
** gjenbrukes på tvers av prosjekter
* tilsvarer i java et sett pakker
* i Java tilsvarer en modul et sett pakker
** skiller mellom API og interne pakker
** distribueres som jar-fil (zip-fil med meta-data)
== multiexample
== https://gitlab.stud.idi.ntnu.no/it1901/todo-list/-/tree/master/todolist[todo-list]
[.smaller]
[.smaller-60]
[.left-60]
* eksempel på fler-modul-prosjekt
** core - kjernelogikk
** fx - javafx+fxml-app
** jaxrs - REST API
** jersey - web-server-app
** webreact - web-klient
** fxutil - hjelpekode for fxui
** fxui - javafx+fxml-app
** rest - REST API og server
** integrationtests - integrasjonstester
** springboot/restserver - alternativ server
== Avhengigheter
......@@ -174,45 +145,30 @@ image::../images/maven-central.png[width=300, link="https://mvnrepository.com"]
[.smaller-60]
* avhengigheter er _eksplisitte_
** deklareres i *build.gradle* i *dependencies*-seksjonen
** krever (fullt) navn og versjon (major.minor.micro)
** deklareres i *pom.xml* i *dependencies*-seksjonen
** krever navn (groupId og artifactId) og versjon (major.minor.micro)
** bibliotek må finnes i deklarerte *repositories*
* _formålet_ angir når avhengigheten brukes
* *scope* angir anledningen avhengigheten brukes i
** *compile* - kompilering (og kjøring) av vanlig kode
** *test* - kompilering (og kjøring) av testkode
** *implementation* - kjøring (men ikke komp.) av vanlig kode
** *testImplementation* - kjøring (men ikke komp.) av testkode
== IDE-støtte
* importere gradle-konfigurerte prosjekter
* basere egen konfigurasjon på gradle sin
** kildekodemapper
** avhengigheter
* utføre gradle-oppgaver, f.eks. kjøre tester
** *runtime* - trengs ved kjøring, men ikke kompilering
** *provided* - trengs ved kompilering, men ikke ved kjøring (er implisitt med)
== Eclipse-støtte
== VSCode-støtte
[.smaller-60]
[.left-60]
* *New > Project... > Gradle Project*: opprette nytt java-prosjekt, ferdig oppsatt med fornuftig gradle-konfigurasjon
* *Import... > Existing Gradle Project*
* *> Gradle > Refresh Gradle Project*: oppdaterer Eclipse sin prosjektkonfigurasjon fra gradle-konfigurasjonen
* gjenkjenner automatisk mapper med *pom.xml* som maven-prosjekter
* konfigurerer editorstøtten og innebygget kompilering deretter
** kildekodemapper
** avhengigheter
* paneler
** *Gradle Tasks*
** *Gradle Executions*
[.right]
image::../images/gradle-views.png[width=300]
* ved større endringer av *pom.xml* og/eller mappestrukturen kan en be VSCode oppdatere sin forståelse av oppsettet
* har tillegg for å utføre bygge-oppgaver, f.eks. kjøre tester, men like greit å bruke terminalen
== CI @ gitlab
* gitlab kan konfigureres til å bygge, når endrer `push`es til et repo
* gitlab kan konfigureres til å bygge, når endringer overføres til et kodelager
* *.gitlab-ci.yml* inneholder byggeinstruksjoner
* hele repoet sjekkes først ut
* hele kodelageret klones over i en virtuell maskin
* så utføres byggeinstruksjoner iht. innstillinger
include::{includedir}footer.adoc[]
\ No newline at end of file
include::{includedir}footer.adoc[]
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment