Building JPMS Modules with Gradle
Speakers: Paul Bakker @pbakker
For more blog posts, see The Oracle Code One table of contents
General
- Nobody in room yet using module system
- Often takes several years after a feature release to be adopted.
- Took 2-3 years after lambda use was common
- Most open source provides a real module or at least a module name in the meta-inf
Plugin
- Maven supported module system early on and still does.
- Gradle did not so developed a plugin
- https://github.com/java9-modularity/gradle-modules-plugin
IntelliJ
- Shows modules as folders
Gradle
- Each module has own build.gradle
- Root build.gradle file is where the modular plugin is applied
- external plugin so set classpath and apply to all java projects
- Dependencies are defined in both build.gradle and module-info.java. Have to do this in Maven too.
- Plugin adds gradle configuration when compile/test.
Flags
- Showed exports – plugin has addExports option when compile
- Showed opens – plugin has addOpens option when compile
- Also supports AddModules and addReads like the Java options
Application plugin
- Creates tar/zip with lib and bin folder
- Supports module path
Packages
- Split packages
- “The classpath always works – as long as you don’t have expectations”
- Always a problem; now in your face
- patch-module as workaround. Puts library in patchlibs instead of being on module path
Multiple start scripts
- Out of box, can create one zip file/one starting point
- Module plugin allows creating custom startup scripts
Testing
- For whitebox testing, ok to break encapsulation.
- Classpath is ok
- Plugin provides moduleOptions on test to choose
- Black box testing – want module path to test how module works from outside module boundaries.
- Use module path
- Need additional module for this approach for tests
Java versions
- plugin has modularity.mixedJavaReleases
- compiler runs in two steps
- compiles everything module-info.java using recent java version (presumably Java 9) and pulls out module-info.java
- compiles other sources using java 8
- the module-info.java is ignored by Java 8
My take
I found the gradle files hard/impossible to read (red/purple/green) on dark background. That made it hard for me to follow the parts I didn’t already know. I did learn some though so it was worth going. And it’s great that gradle has a JPMS plugin! I like how he mapped the command line to Gradle code.