2. MIKSI MODUULI?
› Java 1.0, syntymävuosi 1995, on sittemmin jatkanut kasvua ja
turpoamista
• Mukana kaikkea matkan varrelta, mm. Appletit, Corba, Midi
instrumentteja, Swing, jne
› Toisaalta Javan käyttö vaatii skaalautuvuudelta entistä enemmän
• Mobiililaitteet ja IoT laitteet ja niiden kirjastovaatimukset, vs GUI
sovellukset, vs palvelinsovellukset tai pelkkä back-end käyttö
• Raspberry Pi vs 64GB heapillä varustettu AWS-hirviökone
3. MIKSI MODUULI?
› Javan alkuajoista asti on ollut käytössä termi JAR-helvetti
• https://en.wikipedia.org/wiki/Java_Classloader#JAR_hell
› Mitä ongelmia on .jar tason riippuvuuksien käytössä?
7. MODUULIN TEKEMINEN
› Moduuleita voi alkaa tekemään – ja käyttämään – määrittelemällä
projektin juureen uusi java-tiedosto: module-info.java
› Joka moduulille tulee omansa, se käännetään, ja säilyy näin mukana
käännösympäristöstä ajoympäristöön
› Module-info määrittää moduulin nimen, julkisena näkyvät paketit
joita se paljastaa, ja muut moduulit joita se tarvitsee toimiakseen
› Module-info ei ota kantaa versiointiin
10. MODUULIEN PELISÄÄNTÖJÄ
› Riippuvuuspolussa ei voi olla kahdesti exports-lausetta samalla
paketille (requires voi toistua)
› Sykliset referenssit pahoja täälläkin (moduuli a riippuu b:stä joka
riippuu a:sta)
› Nimetön moduuli näkee kaikki moduulit, ja julkistaa kaikki
sisältämänsä paketit
• Moduuli accessibility-pelisäännöt astuvat peliin vasta jos määrittelet
moduulin koodillesi
11. KÄÄNTÄMINEN MODUULIEN KERA
› javac -d build --module-source-path src $(find src -name
"*.java")
› Kääntää moduulit src alla, ja laittaa vastaavaan
hakemistorakenteeseen build-kansion alle
15. JDK/JRE
› Tulevassa Java ympäristössä on vain kolme kansiota: bin, conf ja lib
• Vanha jre-kansio katoaa pois, jre unifioituu JDK:hon
• rt.jar ja tools.jar katoaa
› Java versionumerointi menee uusiksi
• http://openjdk.java.net/jeps/223
• $MAJOR.$MINOR.$SECURITY
• Mahdollisesti myös Major versiosta pudotettaisiin alusta ykkönen pois,
eli esim: 9.1.1
16. JDEPS
› Jdeps työkalulla voit analysoida koodin riippuvuuksia käännetystä
koodista (mukana JDK 8:sta alkaen)
• nimeät vain luokat joita haluat analysoida, tai kansion, tai .jar paketin
• -jdkinternals parametrilla voit rajoittaa näytön vain jdk osiin joita
sovellus vaatii toimiakseen
› jdeps –jdkinternals myapp.jar
17. MODUULIEN ORGANISOINTI
› Moduulit nimetään kuten paketitkin
› Nyt sopii miettiä tarkemmin, mikä osa julkaistaan, ja mitkä jäävät
piiloon (pakettitasolla), ja mitä riippuvuuksia softa oikeasti tarvitsee
› Hakemistorakenteisiin tulee siis muutos, jos työstät useamman
moduulin projektia:
• src/myapp.solita.fi/fi/solita/myapp/package1/Source.java
18. SERVICE
› Jigsawiin on myös lisätty perinteinen loose coupling-malli service
consumer ja service producer välille
• Uses, ja provides-avainsanaparit (myös with)
› Ei mitään kovin hienostunutta, mutta provider-moduuli voidaan
vaihtaa ennen käynnistystä
20. JIGSAW SUDENKUOPPIA
› Kun hyppää mukaan moduulijärjestelmään, on konseptina sisäinen
ja ulkoinen koodi, eli sisäiset luokat ja rajapinnat eivät olekaan
käytettävissä – mm. JDK ja JRE sisäänrakennetut toteutukset
• JAR paketeissa joka luokka oli käytettävissä, vain näkyvyys vaihteli
• Moduuleissa tulee erikseen julistaa mikä osa on julkista, ja se mitä ei ole
julkaistu, on poissa käytöstä muiden moduulien osalta
21. JIGSAW SUDENKUOPPIA
› JDK ja JRE viimein yhdistyvät – tarkoittaa isoja muutoksia
hakemistorakenteissa
• eli bye-bye kaikille työkaluille jotka käyttivät esim. jre alihakemistoa
› Tähän liittyen lib/rt.jar ja lib/tools.jar eivät ole enää käytettävissä,
menevät eri muodossa alustakohtaisiin paketteihin eri paikkaan
› Ja samoin tähän liittyen endorsed-mekanismi poistuu, eli kaikki
mikä käytti endorsed-kansiota menee rikki – tilalle tulee
upgradeable modules malli
22. JIGSAW SUDENKUOPPIA
› UR schema jolla haetaan resursseja muuttuu, tarkoittaen siis esim.
ClassLoader.getSystemResource() komentoja
• Ennen: jar:file:<path-to-jar>!<path-to-file-in-jar>
• Nyt: jrt:/<module-name>/<path-to-file-in-module>
Editor's Notes
Myös: requires public
Public-avainsana avaa haetun riippuvuuden automaattisesti kaikille muillekin, jotka käyttävät ko moduulia, esim. Yllä jos muoto olisi:
module mailclient {
exports clientpackage;
requires public firstpackage;
}
… se tarkoittaisi että jos joku loisi riippuvuuden mailclient-moduuliin, sitä kautta tulisi automaattisesti myös firstpackage-riippuvuus eli näkyvyys.
On myös mahdollista rajata näkyvyyttä sille mille kaikille julkaistaan:
module java.base {
...
exports sun.reflect to
java.corba,
java.logging,
java.sql,
java.sql.rowset,
jdk.scripting.nashorn;
}
Eli to-operaattorilla voidaan määrittää mitkä paketit saavat näkyvyyden
Esimerkki jdeps tulostuksesta:
-> fi.solita.example.common example-package.jar
-> java.io
-> java.lang
-> java.lang.invoke
-> java.sql
-> java.text
-> java.time
-> java.util
-> javax.inject not found
-> javax.sql
-> javax.ws.rs not found
-> javax.ws.rs.core not found
-> org.springframework.jdbc.core not found
-> org.springframework.transaction.annotation not found
Katso myös:
http://blog.codefx.org/tools/first-release-of-jdeps-maven-plugin/
Huom! Virtuaalikoneessa on –XaddExports lisäkytkin, jolla voi pakottaa haluttujen pakettien julkaisun moduuleille muuttamatta niitä