Is there any need to switch to modules when migrating to Java 9+/Java 11?

Younes EO picture Younes EO · Jul 17, 2020 · Viewed 7.5k times · Source

We're currently migrating from Java 8 to Java 11. However, upgrading our services was less painful, than we anticipated. We basically only had to change the version number in our build.gradle file and the services were happily up and running. We upgraded libraries as well as (micro) services that use those libs. No problems until now.

Is there any need to actually switch to modules? This would generate needless costs IMHO. Any suggestion or further reading material is appreciated.

To clearify, are there any consequences if Java 9+ code is used without introducing modules? Can it e.g. become incompatible with other code?

Answer

Mark Reinhold picture Mark Reinhold · Jul 17, 2020

No.

There is no need to switch to modules.

There has never been a need to switch to modules.

Java 9 and later releases support traditional JAR files on the traditional class path, via the concept of the unnamed module, and will likely do so until the heat death of the universe.

Whether to start using modules is entirely up to you.

If you maintain a large legacy project that isn’t changing very much, then it’s probably not worth the effort.

If you work on a large project that’s grown difficult to maintain over the years then the clarity and discipline that modularization brings could be beneficial, but it could also be a lot of work, so think carefully before you begin.

If you’re starting a new project then I highly recommend starting with modules if you can. Many popular libraries have, by now, been upgraded to be modules, so there’s a good chance that all of the dependencies that you need are already available in modular form.

If you maintain a library then I strongly recommend that you upgrade it to be a module if you haven’t done so already, and if all of your library’s dependencies have been converted.

All this isn’t to say that you won’t encounter a few stumbling blocks when moving past Java 8. Those that you do encounter will, however, likely have nothing to do with modules per se. The most common migration problems that we’ve heard about since we released Java 9 in 2017 have to do with changes to the syntax of the version string and to the removal or encapsulation of internal APIs (e.g., sun.misc.Base64Decoder) for which public, supported replacements have been available for years.