1. Security vulnerabilities
2. The Ask.com toolbar
3. Oracle abandoning Java EE
... which is extremely frustrating because...
1. Virtually all of the "security vulnerabilities" deal with the browser plugin for using applets, which hasn't been widely used in 15 years
2. The toolbar malware, while stupid beyond measure, only applies to the consumer Java installer, which nobody installs anymore due to item #1 above.
3. Java EE is legacy tech. While deeply entrenched, most of the work out there for it today consists of maintenance or migration to more service-friendly approaches like Spring or Dropwizard.
Java is certainly not perfect. It's also long in the tooth, and is associated with "the enterprise", and so it's not seen as "sexy" by young developers. But for business software, large-scale data processing, and web/REST backends, I've yet to find anything on the horizon that seriously competes with it.
Every year I get bored and go exploring a new alternative language in side projects. Every year I come back, more appreciative of what I have. Python/Ruby/Node have their beginner-friendly charms, but are limited by the lack of type checking and/or chaotic ecosystems. Golang seems really promising, but has a long way to go. C# seems like the most credible challenger for business systems, but the .NET Core ecosystem is probably still years away from being where Java was in 2005.
I don't mind discussing Java's shortcomings. But I'm tired of hearing about irrelevant shortcomings such as applets and Java EE. Because that's just a way to keep a "language war" going without having to point at a serious alternative.
Go doesn't have the guts to replace Java, because of the hostile mindset of its community when it comes to writing reusable, general purpose libraries. the famous "you don't need that with Go" is something pushed by go maintainers themselves.
The best bet is .NET core. Microsoft can move quite fast on a project, just look at Typescript or VSCode. And there are already hundreds of thousands of C# devs if not more. C# and F# with .Net core on linux will certainly be the future of entreprise development when the RC mess is sorted out. And MS can still make money on expensive SQLServer
I don't think the latest JEE was that bad though. It tried to do away with a lot of unnecessary complexity.
Go has a pretty comprehensive stdlib. And a huge and growing community of 3rd party libraries. I left .NET and Java for Go around 0.9 and since then I have seen Go flower into an ecosystem I am far more productive than. The Go devs have a bias against complexity, they hate Abstract Factory Factory Singletons :P, but that does have much impact on community developed libraries. The Go community does have a strong bias towards libraries and against frameworks, but IMHO, that is generally healthy. The only concrete example of what you are talking about is the current lack of generics support.
(want generics? too bad! don't like the syntax for [thing]? too bad! want a framework? you're doing it wrong! want to test without using actual sending network traffic? BAM! 50 downvotes on SO for 'poor question'. Got some feedback and post it to golang nuts? HA! Prepare to be shouted out)
...but slowly we're seeing things move to a more moderate and mature state now where people are actually solving problems (like vendoring and SetDeadline()), rather than just pretending everything is ok, and building really good things with it, like go-kit.
It's just go growing up and being used seriously by people; but to be fair to the parent post, if you've used go in the past, I can see why you might have some opinions about it not being run by grown ups.
Worth having another look though. These days, it's pretty good.
There are also technical improvements (as I mentioned) and frameworks (as I mentioned). What more do you want?
Generics? No. You still can't have those.
Different syntax? No. You still can't have that.
...but maybe, now, if you go and talk to people about it, they won't flip the table about it, and you can have a conversation about it with folks on the gopher slack where everyone is reasonable and thoughtful both about legitimate concerns and future directions for change.
In my oppinion, that's a big deal...
Now Microsoft seems to be changing its culture, but I can understand if people are weary.
Maybe Go is a exception, but there's a lot of people happy to use it. (Yes, there's a lot of people happy to use PHP too. Those things always have exceptions.)
RC mess is already sorted out with RTM release, isn't it?
Instead, developers want to abandon the JVM platform. They actively seek new platforms and create them.
The damage is done.
Brian goes about how important compatibility is for the language, the concept not throwing customers code under the bus by bringing breaking incompatibilities. (ie Python 2 --> 3)
Java has its warts and isn't "cool" but I respect their design decisions.
Went there and found a single, totally obvious button labeled "Free Java Download" that detects your browser and Operating System and makes sure you download the proper version of the JVM.
How much easier could it be?
You cannot redistribute the installer or the installed files. Except other things it means, you cannot make a docker image with java app and redistribute it. Everyone has to download their own java installer and build images themselves.
Java (openJDK) is GPL licenced.
Plenty of software comes with Java embedded - ie. IntelliJ Idea. Last time I installed Java was on a digital ocean remote box and I did it through apt-get.
Java may have some licensing that cause some open source system distributions not to include it but that is really their game.
most applications put "oracle jre" in their dependencies though.
This is only true for Oracle Java, which is basically OpenJDK and some dev tools. OpenJDK is basically all you need and you can redistribute it or docker images with it. See http://zulu.org/
Even if you are Day One brand-new to Java, page #1 in any book will tell you to download a Java Development Kit (JDK). Any Google search would take you straight to the download page for Oracle's implementation, which is fine.
The Oracle JDK does not include any "toolbar" malware. That's only an issue for the Oracle JRE download (i.e. the runtime without any compiler)... which page #1 in book will tell you not to bother downloading ever.
The JDK is open-source, based on the "OpenJDK" codebase (much like the difference between Chrome and Chromium). Oracle's binary build has some restrictions on redistribution (see below), but there are numerous other OpenJDK builds. Every Linux distribution has one, as does homebrew for OS X, and there are at least two for Windows:
In the past, there were enough differences between the base OpenJDK and Oracle's build that people were wary of using OpenJDK. As of Java 7, and especially now with Java 8, those differences are nearly zero.
You absolutely CAN redistribute Java. OpenJDK builds have no restrictions whatsoever. Oracle's proprietary runtime binaries are also redistributable, with the only real restriction being that you can't exclude certain files (i.e. they don't want crippled Oracle runtimes floating around that can't run core Java):
Not only are you allowed to redistribute even Oracle's binaries, but the latest JDK includes a "javapackager" utility. It bundles up your code, along with a stripped-down embedded runtime, with an executable wrapper so that you can distribute your app as a zero-dependency standalone (on Windows, OS X, or Linux). Interestingly, I've found that creating an installer for a JavaFX GUI application, with the runtime included, is slightly smaller than the installer for a similar GitHub Electron based app.
OpenJDK is in Debian main, and does not require user interaction.
2. What .NET open source community? I'm not aware of single significant open-source community project in that ecosystem that isn't a lagging imitation of something from the Java community (e.g. Akka.NET, MassTransit, etc). There's a lot of excitement around VS Code, and the possibilities of future stuff on .NET Core, but chatter on HN and Reddit isn't the same as actual shipped code.
3. If by "ecosystem" you mean web forums filled with college students chatting about it, then fine. But I think for most people, "ecosystem" refers to the availability of production-grade libraries and infrastructure components. Try naming one server-side niche in which Maven Centrals lags behind any other language in existence.
This has not been my experience at all. Java's ecosystem and vast libraries of battle tested software is unmatched on any platform.
That being said IBM is working on open-sourcing their core JVM technology to act as platform, not just for Java but other runtimes as well. 
There is hope still...
I still find it the gold standard of language/platform combos.
Granted, Maven Central has the advantage of Java being statically type checked.
But CPAN is awesome. And Perl is dynamic. But modules in CPAN are thoroughly unit tested when you install them.
npm is neither. You find incompatibilities when you run it.
Yet, java was (as someone recently disparagingly put it) "designed by adults". By people familiar with state of the art language research, what was needed and workable, comprehensive specs of language and VM, and complete stdlibs, docs and tools from the get-go. (That is, disparaging to other languages)
And it's also managed to keep up to date, much better than I'd ever have thought: fast JVMs, language evolution, stdlib extended - and perhaps the greatest number of 3rd party libraries of any language ever(?).
Oracle is wrecking that for EE, and may wreck more.
The truth is, J2EE 1.0 was not designed by grown ups. It was designed by college kids and academics who ironically enough wouldn't know the 8 fallacies of network computing if it but them on the ass.
Because it DID bite them on the ass and we have nearly 5 years of vendors flaunting and then polluting the spec to prove it.
Then we have Josh Bloch, who everyone but me thinks is great, who introduced Duck Typing to the JDK (MethodNotImplementedException) and only later confessed that he couldn't understand variance. People defend their bad code by pointing to similar code in the JDK, and Bloch stunted the growth of an entire generation of developers. Then repeated the exact same mistakes at Google.
Me, I'm waiting for a language that Bloch had nothing to do with, and I want to get back to working in limited resource environments. My eye is on Rust right now, and I have my fingers crossed.
This isn't a great comparison because C was, and still is, a much lower-level language than COBOL. If you're looking at that from the perspective of a large organization with millions of lines of code, it's hard to justify the claim that C is “technically more suitable”, because the things C does better are largely irrelevant to business apps while the ISO standard for COBOL includes a ton of higher-level features like an indexed database, first-class support for fixed-precision math (a hard requirement for financial apps), a form library, object orientation, etc. which would need to be maintained as library dependencies in C. Any COBOL programmer would be familiar those but each C developer would need to get used to each application's particular selection of libraries.
A better comparison would something like Java or .Net which both have standard answers for most of those questions and, perhaps unsurprisingly, were quickly adopted by companies trying to move new development away from COBOL. As far back as the mid-90s, a popular approach was to move the front-end into Java (or, later, a web app) and start chipping away at the decades of backend COBOL code running on a big central server.
Can OpenJDK create a fork of the whole Java ecosystem when Oracle wrecks it?
Love 'em or hate 'em, Oracle didn't turn into a factory farm of cash cows by being entirely incompetent.
My mother is a COBOL programmer for one of the largest banks in the EU, and I always enjoy listening to her explaining their systems (IBM Mainframe, Batch processing, etc).
I haven't missed generics that muc, but it would be nice to be able to do things like sorting without implementing a sorter interface.
I can live with this though because everything I've written in go so far had been easy to reason about and most importantly it "just works". I can read anyone's code an understand what it's doing. Can't really say that's been true in the 25 years I've been doing this.
I think the place where java still shines is JVM.There are myriads of JVM implementations out there which is suited for all kinds of purposes.And with the same flexibility ,there are functional languages like Scala or Clojure which targets JVM where all existing java libraries can be used for your new shiny language of choice.Of course .NET has F# or DLR (which I feel is another layer added on top of CLR and I couldn't like it).
What I see is .net has ports for most of the java frameworks or libraries e.g spring,hibernate,lucene,akka you name it. With .NET core being open and F# and C# being super awesome on it's territories (yes am biased :) ) ,we may have good contender to java in some more time.
Oddly, SUN got purchased by one of the few companies everyone hates more than Microsoft. That paired with MS's recent shift to open source and opening the dotNet platform has led to softer view of Microsoft overall.
And our log files had to be localized, which while Java is not perfect, few if any string interpolation libraries match it for being able to deal with written languages that have a different sentence structure than English. It was hard work and one of my coworkers had to invent a new linter to detect unlocalized text in our code, but I couldn't imagine fulfilling those requirements in another language.
They only go far enough to bait and switch you and then after they get you they cut funding for maintenance and the cross platform bits rot away.
.NET Microframework makes it runnable on IoT.
I'm also pretty sure that embedded Java is widely deployed in IoT applications.
XBox One (.NET Core on the future and MonoGame/Mono)
At least you can run c# code on those platforms. Java though is unlikely to ever happen.
Java' documentation as I remember it is still better than Microsoft's.
In the java world there's something similar, but it is no designed from the start for several high-level language flavors.
OpenJDK still was a threat, so they're (MS) more inclined now to open source NET Core.
Today you can choose Java & NetBeans over .NET and V.Studio and will see only minor differences. I mean in tooling and architecture. Today Java seems closer to Open Source than MS, even if MS is "trying". Java & Netbeans are the same on Windows or Linux, of course NET is not.
Haskell people probably say the exact same thing about Java ;-)
While I mostly agree with you, Spring _IS_ J2ee based. (i.e. Servlets/JAX-RS both part of J2ee). Sure it doesn't use EJB but I don't think anybody does (non legacy) at this point.
Said mostly in humor (from long suffering):
The distinction between J2EE and Spring is pretty simple. EJB is a data persistence obfuscation library, whereas Spring's DI/IoC "framework" is an exception (stack trace) obfuscation library.
Of course Spring doesn't leverage ALL of J2ee but I wouldn't except anything to use all J2ee. There is a lot there.
Here in Brazil, the program used to submit the income tax forms is written in Java (http://idg.receita.fazenda.gov.br/orientacao/tributaria/decl...). This means that a lot of people need Java on the desktop. I have relatives which have Java installed on their computers solely for that reason (yes, I have disabled the Java plugin on their computers).
Kotlin is nice too though.
I guess, you don't miss what you don't know.
Richer generics. Dynamic typing is there if you want it. Type inference is great, and then coupled with anonymous types allows for some nifty tool-supported functional-style pipelined programming. (RX and Linq). Upcoming language support for tuples looks pretty sweet too.
Type inference, C# properties (vs. getters/setters in Java), generics are way better, and of course Linq.
Java 8 makes this a bit better with lambdas but it's still a bit of a pain not having the above present. I still like Java though.
Given it sounds like you use Java, what tools/stack do you use with it day to day?
Oh, by all the possible deities, how I wish that was even remotely true...
Although when not needed on a PC I tend to remove it asap (Java)
Don't know much about Python but at least for Ruby, the ecosystem is not "chaotic", it's just way faster moving compared to something like Java, which is stale af.
It's quite easy to manage Ruby projects, I think the only disadvantage to this language is it's quite slow. But does it really matter? For most use cases it's just fine.
As for the lack of type checking, I think that's a poor comparison. Type checked code is not always better than dynamic code, and dynamic code it's not always better than type checked code; They are different.
Maybe for an army of junior developers leaded by a 90's senior developer with a mustache and thick glasses, a boring safe language like Java is the best. For a team of experienced developers with deadlines, Rails can get the job done in a quarter of the time.
I guess, it depends on the application.
- I would not use Java for desktop applications.
- Not for small quick and dirty scripts that I will use once on a while. I use Perl for that.
- Neither for command tools. Start up times may be an issue.
- For server applications, java is great.
...unless it's not the main application run by the server (like in auxiliary
services, message spooler, monitoring agent, some kind of cleanup service,
stuff like that). Then its memory usage is a mess.
I'm not a software developer and have no dog in this fight. Sometimes I use Matlab's idea of OOP to factor out code by domain of representation (so simulations of agricultural yields are instances of a LandUnit object with some properties and one or two methods); never to abstract programming out the way OOP design patterns do.
I'm more attracted to the Haskell style of types and type classes, as far as "abstracting progrmaming out" goes, but I don't do any programming in the large, so what the hell do I know. I just pointed to the debate between people who should know, c2 wiki is very good on the things I do know.
I don't think there is a problem with the Java Language or the JVM.
But if you don't use OOP, what are you going to use that makes things significantly better? "There is no silver bullet", as Fred Brooks said.
What about https://github.com/graalvm/truffle or https://bitbucket.org/allr/fastr/wiki/Home or https://www.youtube.com/watch?v=OUo3BFMwQFo ? There is serious innovation happening in java land (through Oracle - without talking about Clojure, etc.)
Java EE exists because of the need to support large legacy, enterprise customers.
For those who are starting out in Java web frameworks, people usually use Spring or Spring Bootstrap (and sometimes the newer Java 8 only http://sparkjava.com/).
Btw, that is a real class, not a made up example.
But then there is spring-boot http://projects.spring.io/spring-boot/#quick-start
It got huge and bloated.
Some people came along and created some lighter frameworks.
Java is a great language, that has made some improvements with lambdas etc.
"Container" is the key word here.
J2EE had the notion of an app server hosting your app.
The extreme alternative is to have your app be standalone and "embed" an I/O protocol (HTTP) server. I've had great success with this strategy.
Sadly - the language is really not quite as 'async' as we would like it to be.
Past 50K lines of code - the lack of typing in JS can start to be hell, unless you really know what you are dong.
Of course, you move much more quickly early on in JS and that's actually important: you need to be able to 'iterate and adapt' in todays world. So it's kind of a paradox.
If you're building a bank, you do it deliberately with Java or something like that.
If you're building a nimble startup, you can start with Node and if there are systems that reach a certain degree of maturity and the uses/cases and data model start to settle you can fold over systems to Java or something like that.
A great team can use anything in the end though - that said, it's really hard to find super talented and responsible people across the board.
JVM concurrency is best in class. It's just the Java language itself that moves at a snail's pace.
However in my opinion there is something about Java/Java designers at Sun/Oracle/IBM that lead to over designed APIs and code. Looking at just Java servlet api, it is described in most elaborate manner. It is not about supporting Http Listeners endpoints + some additional features but about any kind of servlets possible for past and future protocols. It is awkward and lacking features for practical Web based applications but still has 74 class just for specifying servlets and no implementation.
So arguments about Java SE vs Java EE vs Spring vs Other hot Java framework seems facile to me. Java it self has set the tone to describe things in most elaborate manner, not most succinct manner and anything on top of that more or less follow that tradition.
So I downloaded the JDK, Glassfish and a PDF of a book called "The Java EE tutorial" from Sun.
I found it slightly disturbing that Glassfish (or was it JBoss? It was so long ago...) used ~400-450 MB of RAM before I had done anything to it.
And then I started reading the so-called tutorial. The fact that it had ~1100 pages should have tipped me of, but it did not frighten me. When I looked and the Table of Contents, however, which came with a freaking flow chart on how to navigate your way through the book depending on what you already knew, I ran away screaming. ;-)
And to be fair, in my brief attempt to learn C++ I, too, looked at my first slightly-nontrivial-toy-program when it was finished and found it incredibly over-engineered. So I know how easy it can be to give in to that temptation.
Also, there is this old saying that a given piece of software will reflect the organizational structure that created it, if large corporations send hordes of programmers to attack such a problem as creating Java EE or the servlet API, it is not a surprising result.
In a way, .Net has the same problem, to a degree. I have not used it much, but one of my first toy programs was an address book that got its data from the Active Directory, and the LDAP API was significantly more complex than, say, Net::LDAP in Perl. Not unusable, but the difference is noteworthy.
Java/EE slogan is 'RAM is so cheap nowadays!' for anyone questioning why applications seems so bloated. If you had temerity to probe further they would drown you in blizzard of serious sounding technical/business buzzwords.
After I had the honor of writing a few simple-minded Perl-CGI-script to give my boss an overview of projects our company is working on and their respective profit margins, I begun to understand why. If somebody tells me computers are complicated, I tell them that computers are trivial compared to accounting. Or my brain is just wired that way... Listening to our accountants always makes me feel like me IQ just dropped by fifty percent (or more). So if somebody writes a piece of software that is somehow involved with accounting, it is bound to be very complex with lots of special cases and exceptions.
I have nothing but the utmost respect for our accountants who manage to deal with this insanity without sacrificing a goat to Cthulhu or something.
TL;DR - once one reaches that level of complexity, the complexity JavaEE puts into the mix is probably fairly tame and one has bigger fish to fry or escape from.
I feel JavaEE is very large orthogonal complexity which somehow neither solved nor reduced enterprise complexity. It added a jargon speak and multiple layers to bury enterprise problems and reduced net understanding of issues.
Maven Central is Java's CPAN, and that's what you need in order to build a thriving open source ecosystem.
But the Java ecosystem is awesome. The language is great, the JVM is great. As long as you know what you are doing.
You'll notice most engineering focused companies don't use Oracle because they decide on tech based on different criteria and allow more input from engineering and don't mind building things. They have to bet on tech or else they have no reason to exist.
Oracle SQL might be the fastest, most robust out of the box database, but for a huge deployment like Google/Facebook/Twitter, even out of the box Oracle SQL won't be good enough. It's kind of an unfair comparison.
That's not to say I'm defending Oracle's bullshit, but you gotta put these things in perspective.
eBay also used Oracle in the past (if you dig back in the past of their architecture/design of eBay).
 To be fair, I think this sort of thing permeates this type of "let's talk over lunch" sales model.
> 1. Drop the profiles. They are useless and pointless waste of time.
This is true, but profiles exist mostly for the benefit of vendors, not developers. Developers only care about modularity, see #2.
> 2. Make Java EE a conglomeration of technologies that are known to work together (i.e. JPA, JTA, JMS), but don't force their full installation. Let the use pick and choose what they want. Just be sure that they work together in pieces or in totality.
You can do this today, if you use good implementations for those APIs (JMS, JPA)
> 3. Make it modular. Start with zero and let people add what they want to use.
Same as #2, plus Jigsaw.
> 4. Get rid of the tree class loader. You need it matrix based. OSGi is fine. Jigsaw is fine. But it needs to have classes that can be loaded and unloaded without an impact on the container.
> 5. The container itself should be a thin shell with remote capabilities (again OSGi/Karaf looks really good here)
The OSGi spec gets a bad rep for complexity, but it actually solves a hard problem. Karaf's default UI, on the other hand, is terrible.
> 6. Make it cloud friendly. Microservices needs to be core functionality, lightweight, and run in the cloud.
Uhh, it's pretty cloud friendly now. Not sure what the author wants here.
Ultimately the author says, if you're invested in the Java EE ecosystem, you can't rely on Oracle to move it forward, but you shouldn't let their inaction lead to your inaction.
However, due to IP reasons and a perceived past overengineering, the community has nearly given up on Java EE and focuses on Java SE instead. This means that they've adopted points #1, #2, #3 and #6, and are actually moving the ecosystem forward, just piecewise and no longer under the 'Java EE' name.
As well as those 2, Dropwizard is excellent if you're writing REST apis and provides many enterprise-friendly features out of the box.
SparkJava (don't confuse with Apache Spark) is a very lightweight Sinatra/Flask-like framework using Java 8 features, and good for REST apis too.
2 more to consider IMHO: Vert.x, and Comsat from Parallel Universe. Parallel Universe have one of the most interesting technologies in Java-land IMO. They provide a library called Quasar that adds suspendable green threads (similar to Erlang processes) to your code using bytecode instrumentation. This allows a single server to handled a huge number (think 00,000s) of concurrent connections. Vert.x has support for Quasar too.
I'm sure others have favourites too.
Play is incredibly convenient and has some very sane, intuitive defaults which makes getting something going very, very simple. Play Authenticate and Deadbolt for instance are excellent and give near out the box authentication and security for your Play app.
Where Play fell down for me was:
1. Dependency management. SBT felt so damn impenetrable. On top of that any Scala or Java libraries were coupled to the binary version of Scala which meant updating and checking every dependency anytime I upgraded to a Play version which used a newer version of Scala.
2. Play breaks a lot of things between versions. Considering it came out in 2007 it's kinda concerning that so much changes between versions and can be a real pain point.
3. In Play Scala is a first class citizen and Java a second class citizen. I started out using Play Java, but it felt like every time I needed to do anything with it I had to consult both Play's Java and Scala docs.
Spring Boot is a real breath of fresh air for a Java dev. Sane defaults, no need to use XML configs, cool stuff like CrudRepository to make persistence an absolute piece of cake to setup.
I do miss database evolutions and the ease of Play Authenticate/Deadbolt and the great asset management utilities which Play provided but Spring Boot can do all that with a little bit of tweaking and then some - Spring Security, DropWizard Metrics, support for Jersey and just lots and lots more make SB super powerful.
Spring Boot also has a lot more tutorials and quality paid for courses so getting skilled up is more straightforward.
Finally from a project manager point of view finding competent Spring Boot developers is a LOT easier than finding competent Play/Scala devs.
Regarding the other Java web frameworks, Dropwizard's dev community seemed liked it had less momentum than SB or Vert.X. It also seemed less up to date.
Vert.X was the most compelling alternative to SB for me and I spent a fortnight messing around with it - lots of fun. It provides an excellent asynchronous event engine and if you like Lambda expressions you'll love coding in it. Very enjoyable to use and the community is fantastic. It has a lot of momentum and you can also integrate it with SB to give you the best of both worlds.
Spring Boot has integration with Flyway which works pretty smoothly, if that's any use:
Slightly newer: Spring Boot (uses Spring MVC as well)
Cutting Edge + keep-up with upgrade mill: Play, everything else not on the list above
It's actually based on Spring Boot.
Someone has to pay for the talented and expensive people needed to develop, maintain and extend a language/ecosystem ("community" does not == free of cost).
It isn't obvious to me what the underlying motivation would be to drive the investment required. For Swift/C#/Golang it seems to be roughly "Platform Entrenchment" or perhaps "if not this then we're owned by $otherbigco". Oracle doesn't really have a platform to entrench these days.
I guess, most people who make a scene about Oracle's stance think that Java EE is the same as the JCP. The JCP will go on and JSRs that are part of EE will continue to evolve. Its just a question of which JSRs still have value in a world of fast changing cloud / compute infrastructures.