“How to Make a Project Java 9 Compatible”
Speaker: Nikhil Nanivadekar
For more blog posts from JavaOne, see the table of contents
Examples use Eclipse Collections
Examples from:
https://github.com/nikhilnanivadekar/Java9Compatibility
https://github.com/nikhilnanivadekar/Java9Modules
Reflection
- Used ArrayListAdapter which uses reflection
- Got illegal-access warning (when default was warn; now it is permit
- If run with illegal-access=deny, it fails
- Lesson: have lots of regression tests so know about such errors
- Lesson: Allow a lot of time to migrate. Don’t start Friday evening. Long sequence of “just one more compilation error to fix”
Infering types
- Compler error because can’t assume generictype to return
- Comes up when class doesn’t have a generic type and try to store it in one that does.
- Compiler not supposed to infer type
- Fix is to cast or store in a local variable
- Similarly need to declare types on class instatiation if not diamond operator usage
NullPointerException
- collect() now calls Objects.requireNotNull(combiner).
- In Java 8, a null combiner worked in serial mode because not used.
“I love compiler errors vs runtime exceptions”
Migrating a Java 8 Maven project to Java 9
- Migrated a maze solving project. Was written recently so not legacy code
- Switch source/target of maven-compiler-plugin to “9”.
- Changed JDK in IntelliJ.
- Maven itself works fine with Java 9. Compiling works. JavaDoc and Enforcer plugins work fine with milestone version; not yet for released versions. Seewiki on support for Java 9 in Maven plugins
- Looking at modularizing library in future
- Runs without adding module info file or doing anything else
- Once add module file, more enforcement happens. ex: error on unnamed packages
- Eclipse and IntelliJ have quick tip to add requires
- Important: start with base module
- If not using a build tool, need to ensure no cyclic dependencies. (build tool takes care of this for you)
- Add exports clause for module. The compiler error just says the class isn’t found. It doesn’t say it is because the export is missing.
- Move code in split package to another package updating all callers
- Delete empty package; can’t have empty package
- Hide internal packages by not exporting sub-packages
My take: Nice to see issues by example. And nice to see that it wasn’t “all about Jigsaw.” It was a good mix of problem types!