Moving to Java 17 or how I learned to stop worrying and love NoSuchMethodError
Icon Solutions upgraded to Java 17 in IPF 2024.1 for Spring 6 and Spring Boot 3 compatibility. Challenges included plugin and dependency adjustments, emphasizing centralized management and code cleanliness post-upgrade for smoother transitions.
Read original articleIcon Solutions recently upgraded all components to Java 17 in their IPF 2024.1 release. The lead engineer shared insights on the upgrade, highlighting reasons for the move, including support for new Java features and improved garbage collection. The decision was influenced by Spring 6 and Spring Boot 3's requirement for Java 17+. The upgrade process involved addressing compatibility issues with plugins and dependencies, particularly those related to Java EE to Jakarta EE transition. Despite challenges, the team documented their experiences to assist customers in similar upgrades. Lessons learned emphasized the importance of centralized dependency management and staying updated on plugin versions to facilitate smoother transitions. The blog post also touched on the need to maintain code cleanliness post-upgrade. The upgrade to Java 17 was seen as a valuable learning experience, ensuring compatibility with modern frameworks and technologies while prioritizing stability over early adoption of cutting-edge features.
Related
The Prototype's Language
The evolution of programming languages in payments technology sector is discussed, highlighting the shift from COBOL to Java and now to Python for its speed and adaptability. Language choice impacts developers and work quality.
The software world is destroying itself (2018)
The software development industry faces sustainability challenges like application size growth and performance issues. Emphasizing efficient coding, it urges reevaluation of practices for quality improvement and environmental impact reduction.
Interface Upgrades in Go (2014)
The article delves into Go's interface upgrades, showcasing their role in encapsulation and decoupling. It emphasizes optimizing performance through wider interface casting, with examples from io and net/http libraries. It warns about complexities and advises cautious usage.
"Barely" is an understatement. You just shouldn't do this as part of a big version migration. It's noise, and introduces more changes that could cause bugs, and then you end up wondering if the bugs were caused by the big version migration, or by all the little changes that were supposedly cosmetic.
Arguably you shouldn't make those types of changes on their own at all. If you're later refactoring the code for a "real" purpose, or making other type of changes in that area, sure, go ahead, the code that you're working on to their more modern forms. But otherwise they're akin to rewrites: the existing code works, and has been tested and debugged, and changing it just so it "looks more modern" is pointless.
This seems to be a application of the second system effect noticed by Fred Brooks in the 1960s (that the second version of a system is extraordinarily dangerous because of all the "while we're in here why don't we..." opportunities)
Moving away from traditional JNI (especially with critical JNI natives) also complicates what used to quick and easy work. But at least Panama clearly comes with interop and compiler-level improvements.
Jigsaw though... I can't even.
Thank you Spring Boot, and long may it continue.
X, or how I learned to stop worrying and love Y
X for fun and profit
A tale of two X
X considered harmful
Related
The Prototype's Language
The evolution of programming languages in payments technology sector is discussed, highlighting the shift from COBOL to Java and now to Python for its speed and adaptability. Language choice impacts developers and work quality.
The software world is destroying itself (2018)
The software development industry faces sustainability challenges like application size growth and performance issues. Emphasizing efficient coding, it urges reevaluation of practices for quality improvement and environmental impact reduction.
Interface Upgrades in Go (2014)
The article delves into Go's interface upgrades, showcasing their role in encapsulation and decoupling. It emphasizes optimizing performance through wider interface casting, with examples from io and net/http libraries. It warns about complexities and advises cautious usage.