Portability versus Productivity
Perhaps the biggest productivity destroyer in J2EE development involves the slew of frameworks - and the rate at which one framework replaces another.
The primary motivator behind replacing a (perfectly good) existing framework - with a new one - is the aversion of the java community to anything deemed
proprietary.
When an open source framework such as Struts or Hibernate gains popularity, each J2EE vendor releases their own
enhanced version of the framework (WebSphere Struts, OracleAS Toplink etc.). As these vendor-specific frameworks are
deemed proprietary, the java community launches a huge overhaul effort to replace the existing framework.
Hence - Struts (a perfectly good, useful and powerful framework) has to-date been replaced by Spring MVC which has been superceded by JSF (not to mention
a few other competitors like Wicket
and Tapestry