All the discussion on Slashdot today about the release of Mono 1.0 (people variously asserting that Mono is the devil, Mono is crucial to Linux, Java is better, nyah, nyah,
your father smells of elderberries) got me thinking again about what the real values of Java
as a platform are. As a language it's fine, but other OO languages are good too. The API's are fine, plenty to choose from but that's not it it either.
It has struck me more than ever over the last couple of years or so while Java has really matured that its real value is as a lingua franca development platform, not a language or a VM. The platform developers agree on language (Java), API's (XML, net, logging, threading, etc), namespace management, API documentation (JavaDoc), build systems (Ant and Maven, standard build layout in src, lib, classes, etc) deployment (especially for web deployment) and even IDE's to some extent (a number of projects I received recently came with Eclipse project files). You can take big web app developed in SunOne and have a very good chance of running it in WebSphere or Tomcat/JBoss. I've developed my own web apps in Tomcat on Linux and then dropped them into WebSphere on Windows without issues (this ability to move apps around must give Bill Gates the shivers).
This standardisation allows me to grab some fairly complex libaries and frameworks and just use them, without worrying about what hokey build system, source code layout, language, memory manager, collections framework, homegrown logging system or dirty preprocessor tricks it uses.
The language part of the Java platform is the smallest part. It's a standard: I don't particularly care what the standard is, just that it's good enough and that everybody agrees with it. The common language is important across projects too: although I can use a library in .NET that's written in Eiffel# I'm likely to have some problems if I need to dive into the source to work out what I'm doing wrong. The language-geek dicussions about generics, value types, checked exceptions, etc are, while interesting, just not germane: none of these are features that would influence your choice of platform. The key choice is the environment: platform API's and runtime containers.