Java 8 still widely used
jetbrains.com
jetbrains.com
Perl 5 -> Perl 6 is the oddball without a migration path because they're totally different.
Apple views that as a good thing.
Python got very lucky with their strong community support. Millions of hours were invested into upgrading Python2 code to Python3, essentially on trust in the early years (2009-2013).
Without the strong community support Python could have gone the way PHP did in the 5 -> 7 -> 8 era
It's interesting to compare these with languages that never did the breaking change to clear out their tech debt. Back in the day, Javascript was nearly universally hated (The Good Parts was very controversial!), and it nearly splintered into multiple languages, but managed to consolidate under ES5 and then explode in popularity without ever having a Python2-3 moment.
Scroll down to Python Versions
They clearly did something better than Java. 94% vs 6% (and that was 2020!)
6 percent of people in 2020 were using Python 2, 12+ years after Python 3 was released. 12 year old Java right now is Java 7, which is only used by 2 percent of people in this link.
You search for java.
You click the first result and go to java.com.
You click Download Java.
You are given Java 8.
You are now somehow a mystery.
They are not lying...
export PATH="/opt/homebrew/opt/openjdk/bin:$PATH"
java -version
openjdk version "21.0.1" 2023-10-17
One macOS Sonoma 14.1.1 just now:
$ brew info java
...
For the system Java wrappers to find this JDK, symlink it with
sudo ln -sfn /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk
openjdk is keg-only, which means it was not symlinked into /usr/local,
because macOS provides similar software and installing this software in
parallel can cause all kinds of trouble.
If you need to have openjdk first in your PATH, run:
echo 'export PATH="/usr/local/opt/openjdk/bin:$PATH"' >> /Users/[username]/.bash_profile
For compilers to find openjdk you may need to set:
export CPPFLAGS="-I/usr/local/opt/openjdk/include"
...Their current best solution is to put a modern version wrapper around .Net Framework and to map between them, but that isn't exactly ideal either (since you wind up with a giant mess).
Meanwhile, .NET Framework 4.8 is several years old and will almost certainly still be getting security updates ten years from today. To be clear, Microsoft provides better support today for Visual Basic 6 than it does many versions of the modern .NET.
The old stuff will stick around for basically the same reasons that people still write C/C++ software using Win32.
Because the resulting applications are much better?
Then I get to the tooling and it's just such a pain, if it's working we don't touch it. Our repository was checked in "eclipse format". Tried to move it to jetbrains. No dice. it too, me a few days to get it so i could compile and run under eclipse. I'm not an expert but I don't want to touch it for fear of breaking. New projects aren't done in Java. Php perl and python have a better dependency story, though slower.
none of those have a better dependency manager than java's maven. The fact that the project you had to work on didn't use maven isn't evidence that java's tooling is bad!
of all the current industry wide languages, java is the one with the best tooling, including IDEs, profiling and tracing, deployment options, and debugging and logging etc.
It can be simultaneously true that some Java tooling is excellent and some of it is subpar. This is a problem when both kinds have been historically popular.
Indeed, that's amateur hour. Says more about the developers that checked in that code than about the language or tools. I have a love hate relation ship with maven and gradle. They are convoluted and over engineered. But they do work reliably once you get over that.
Python dependencies are messy. That mostly relates to the fact that a lot of python needs native stuff which is just not that portable. This is why things like conda exist; so people can use native dependencies that otherwise would be hard to install on platforms like windows. There was a nice article on this on HN a few weeks ago I think. There seems to be no standard way to install stuff for python but about four or five competing ways to do this. With pip3 being the miserable baseline that the other ones are trying to improve on. I've tried several of those in the last year.
Php actually has a decent dependency manager these days. I'm not necessarily a fan of the language but the php community has done a decent job modernizing their tools and language over the years. Things like Wordpress make it look worse than it really is.
Java and Jvm tooling is indeed awesome. Best in class tooling has been a decades long tradition with the language. And of course Jetbrains is a big part of that. But Eclipse and IBM actually laid the groundwork for that when they bootstrapped out of the Smalltalk community in the nineties. Around that time other time other IDE builders of note were also providing tools for Java. Most of those are long forgotten by now.
But the smalltalk refactoring browser was where it all started in IBM. And a lot of those people ended up working on enterprise Java. Eclipse as a tool is a direct descendent from that stuff (via IBM's Visual Age, which came out of their smalltalk tools). It was the first proper Java IDE with lots of refactoring options. Jetbrains followed with intellij.
These days, there are many things you can do inside intellij with Java and Kotlin that few IDEs for others come close to being capable of. Even renames (of any symbols) are science fiction in some IDEs. And that was a standard feature in the very first version of eclipse.
Stuff like this requires decent tools that work on abstract syntax trees. That tends to be hard for dynamically typed languages. But languages like Go, Rust and a few other modern languages don't have that excuse. And yet none of those have anything better to offer than what Jetbrains provides for those languages. Which while nice just isn't the full feature set that Java or Kotlin developers would expect. Good tools are hard.
You probably already know this, but since Java has dynamic loading of code, even if the dependency is not used in the source code, it does not mean the dependency will not be used when running the code. Either through direct use of reflection ("Class.forName()"), or a drop-in file used through ServiceLoader, or even a magic resource file which makes the code go through a different path when present. Carelessly removing a dependency might make your application break, possibly only when the specific functionality which dynamically needs the removed dependency is called. So yeah, you kind of have to be an expert on all the frameworks your application uses before you can start trying to remove unused dependencies in Java, and a tool cannot help you much.
In my 20+ years of professional Java dev I have never seen an organization that would employ proprietary eclipse or jetbrains repos. Maven is king and always has been.
Another data point. Our open source JWT library[0] and Java client library[1] both target Java 8 because that is widely used.
No issues with licensing - openjdk and others are perfect for production use for the vast majority (imo). Some supermassive projects excluded but they are always outliers.
The migration path after 8 is just a pain, As you mentioned, package. The name changes are for no benefit to developers or end users.
I recently joined an AI team (platform/infrastructure/apps rather than the actual data science proper) and since then I’m trying to do less and less in Java and more and more in Python-so that mess may be left for someone else to resolve. But Python contains dependency hells of its own
The Javax -> Jakarta changes for validation, EE, XML, etc. are a damn nightmare!
- 50% use Java 8
- 72% use Spring
- 74T use Maven
- 78% use IntelliJ
- 38% develop web site
If it works, don't touch it.How are you measuring this? Anecdotal factoid is a bit of an oxymoron
Obnoxious pedant mode: it's actually not, because GP misused the word "factoid".
From Wikipedia[1]: "A factoid is either an invented or assumed statement presented as a fact,[1][2] or a true but brief or trivial item of news or information."
64-bit Java Runtime (JRE) 8u392-b08
32-bit Java Runtime (JRE) 8u392-b08
64-bit Java Runtime (JRE) 11.0.21
64-bit Java Runtime (JRE) 17.0.9
64-bit Java Runtime (JRE) 21.0.1
How is the average person to know which one is best for them and why?Legacy is going to pick 8 (or maybe 6 or 7 for very old stuff), green field may opt for 21, and others should select 11 or 17 depending on vendor recommendations and support.
The culture around Java is conservative; it has a lot of inertia. That's why I support Kotlin; it forces project contributors to leave their dated habits behind. Java libraries still work, of course.