Modularność wprowadzona w Javie 9 jest niewątpliwie jedną z największych nowości języka. Jednakże nie na samym Projekcie Jigsaw zmiany się kończą. Java 9 wprowadza małe i większe zmiany do platformy. Podczas prelekcji skupię się na modularności, porównaniu do OSGI, na wybranych zmianach wprowadzonych od Javy 9 oraz na tym co może przynieść nam przyszłość.
5. Modularity
• Make the Java SE Platform, and the JDK,
more easily scalable down to small
computing devices
• Improve
• security
• maintainability
• performance
• A module system for application developers
• Hide platform internals (e.g. sun.misc)
• Reliable application composition
Piotr Stawirej|@p_stawirej|4Developers 2018
29. Transitive Static?
• Services are better for optional dependencies
• For enabling modularization of legacy code
• Put responsibility on consumer to verify API
Piotr Stawirej|@p_stawirej|4Developers 2018
31. Deep Reflection
`
API
Elon
Earth
core
<<package>>
Oceans
<<class>>
java.lang.IllegalAccessException: class user.elon.Elon
(in module module.elon) cannot access class planet.core.EarthCore
(in module module.earth) because module module.earth
does not export planet.core to module module.elon
java.lang.reflect.InaccessibleObjectException:
Unable to make public java.lang.String planet.earth.Oceans.oceans()
accessible: module module.earth does not "opens planet.earth"
to module module.elon
Piotr Stawirej|@p_stawirej|4Developers 2018
37. Compile, Package, Link
binjava.exe --list-modules
java.base@10
module.api
module.earth
module.elon
module.mars
jar -d --file=elon.jar
exports user.elon
requires java.base mandated
requires module.earth
requires module.mars
Piotr Stawirej|@p_stawirej|4Developers 2018
38. Package, Link, Versioning
Package
• Dependencies are transitively resolved on modulepath not classpath
Link
• Uses explicit dependencies from module-info.class
• We know which modules are going to be run
• Aggressive optimizations
Versioning
• Modules resolved purely by name
• Module version is only attribute
• Use e.g. Maven, Gradle
Piotr Stawirej|@p_stawirej|4Developers 2018
39. Java Modular vs OSGi
Module vs package dependencies
• Module dependency: depend on a module, no matter what’s in it
• Package dependencies still exists in code (imports)
• Package dependency: depend on a package,
no matter where it comes from
• Better decoupling
Piotr Stawirej|@p_stawirej|4Developers 2018
40. Java Modular vs OSGi
Module vs package dependencies
Piotr Stawirej|@p_stawirej|4Developers 2018
41. Java Modular vs OSGi
Java exported packages
• Exported packages only visible to predefined „friend modules”
• Necessary to split up JDK
• Only one module may export a given package to another module
Piotr Stawirej|@p_stawirej|4Developers 2018
42. Java Modular vs OSGi
Services
Services OSGi
• Services are explicit in module metadata
• No lifecycle
• But can be loaded at run-time
• Services wired programmatically
• Service dynamics and bundle lifecycle
• Services can have properties, filters
Piotr Stawirej|@p_stawirej|4Developers 2018
43. How could the future look like?
`
Piotr Stawirej|@p_stawirej|4Developers 2018