如何在开发基于Java EE的Web应用程序时提高工作效率

我想知道如何解决与其他技术堆栈( Seaside , Ruby on Rails等)相比基于Java EE的Web应用程序开发看似低效的问题。

约束是:

  • 完成的Web应用程序必须可以在符合Java EE的应用程序容器上进行部署
  • 如果可能,应保留以前对基于Java的解决方案的投资,即应该可以实现与基于Java的系统和库的本机互操作性
  • 由于团队结构的原因,Java作为实现语言是首选,尽管可以接受不那么奇特的基于JVM的语言(即Groovy)
  • 由此产生的系统需要在架构上是合理的
  • 由此产生的系统需要是可扩展和可维护的

为了不让这个进入哲学讨论,我只对基于实践经验的建议感兴趣。 可能的示例包括特定于域的语言,框架和MDSD。

如果您指向一个抽象类的解决方案(如MDA / MDSD),请提供有关如何实现它的详细信息以及有关常见陷阱和最佳实践的信息。

如果您不同意基于Java EE的Web应用程序开发意味着生产率较低的假设,我也想听听您的推理。

编辑:由于答案远远少于我的预期,我也会接受有关失败尝试的说法,基本上将问题扩展到“如何(不)提高开发基于Java EE的Web应用程序时的工作效率?”。

我相信Java EE Java堆栈实际上非常好。 有几个原因可以解释Java EE的低生产率:

  • 作为“企业堆栈”,它通常用于创建枯燥,丑陋,“足够好”的应用程序,一般而言, 企业往往不会吸引热爱编程的优秀开发人员,并思考和关心他们的工作。 企业界的软件质量并不高。
  • 作为资金所在的企业堆栈,软件供应商试图向他们出售产品。 他们制造庞大,复杂和昂贵的解决方案并不是因为它们很好,而仅仅因为它们可以将它们出售给企业。
  • 企业通常都非常厌恶风险,他们做得更好的一切都是“标准化的”。 某些技术被certificate是成功之后或之前创建标准。 在这两种情况下,它对企业(和Java)都不利。 企业最终使用的技术太晚或技术彻底失败。 后一种情况也非常危险,因为如果技术标准化并且每个人都在使用技术(否则完全失败)必然是好的,它会产生错误的看法。
  • 从历史上看,Java EE平台似乎吸引了大量的架构宇航员和大公司的开发人员,他们被提升为架构师,他们的唯一目的是创建更多层,更多框架,更多抽象和更复杂。

并不是没有好的Java工具和框架; 这是有太多不好的,太多的过度工程,太多的官僚程序和方法,太多无用的标准。

在这样一个混乱的世界中,不仅仅是您选择的特定工具选择会影响您的生产力。 它主要是关于您,关于您的价值观,关于如何拒绝社区,供应商,同事和经理向您提出的大多数解决方案。 这是关于你反对当前的,关于你的常识,关于质疑每个主流信念和“最佳实践”。

也就是说,仅工具本身并不会大大改变您的工作效率,相反,合适的人也可以使用劣质工具来提高工作效率。

我的建议:

  • 不要只使用技术,因为它是标准的,因为每个人都使用它,或者因为它是Sun正式推荐的。 只有在您个人认为它是您工作的最佳工具时才使用技术。 通过这种方式,您可能会发现自己拒绝使用JSF,JSP,Web服务,JMS,EJB,JTA,OSGi,MDA等技术。
  • 保持简单,运用常识,质疑一切。 您真的需要发布对象以进行远程访问吗? 你真的需要创建另一个抽象层,以便你可以从Hibernate切换到TopLink吗? 您是否真的需要在每次需要时将数据转换为XML或从XML转换十次? 你真的需要XML架构吗? 您真的需要可配置的所有内容都可以互换吗? 在运行时? 非开发人员?
  • 保持流程简单。 敏捷 。 你真的需要那份文件吗? 你真的需要在一个巨大的表格中描述每个屏幕,批准它,将它输入到一些自制工具然后生成JSP吗? 您是否拥有称职的程序员或您首先设计所有内容并且程序员只能“翻译”为Java?
  • 所见即所得的HTML设计不起作用。
  • 通常,图形编程不起作用。 这包括UML作为蓝图 , UML作为编程语言 ,MDA,绘图页面流程图。 代码生成很糟糕。
  • 在使用框架之前永远不要设计框架 ,总是收集框架 。
  • 首选只有很少XML配置的框架。
  • 争取低LOC数。 查看代码中的实际字符 。 每个角色都重要吗? 认为。 你能做些什么来缩小代码? 你需要那堂课吗? 它有什么作用? 你为什么要那样做?
  • 测试不是神圣的牛; 你不需要100%的测试覆盖率。 只测试有意义的东西。 如果难以测试,请使其更简单; 或者根本不测试它。 不要测试视觉外观。

最后,一些具体的Java建议:

  • 对于表示层,尝试Tapestry 。 我为什么喜欢它? 因为使用Tapestry,您可以创建漂亮的代码。 它专为此而设计,因此您的代码可以很漂亮你的代码。 美丽我的意思是重要的一切 – 它简短,易于更改,易于阅读,易于创建您的抽象,并且仍然灵活,它不会试图隐藏您正在为Web开发的事实。 当然,你的代码仍然是美丽的。
  • 随意使用Hibernate,特别是对于CRUD和大型应用程序。 不要打扰JPA。 然而,这不是一颗银弹,有了ORM,你总是会把另一套问题换成一套。
  • 只有一点点Spring,你应该不需要太多,因为你已经仔细避免了所有的Java EE陷阱。 谨慎使用dependency injection。
  • 毕竟,在抽象出复制/粘贴代码时,您可能会发现Java语言过于冗长且不太有用。 如果您想进行实验,请尝试使用Scala。 问题在于Scala的主要卖点是,您可以在保持类型安全的同时获得现代语言的所有好处,同时,没有可靠的 IDE支持。 过去用于超酷Java IDE,除非有一个稳定可靠的IDE支持,否则切换到Scala没有多大意义。 足够稳定是不够的。

像Spring , Hibernate , Wicket这样的框架当然有助于简化和加速Web开发,因为它们提供了高度的可测试性并且非常好地集成。 但即使您有一套良好的开发实践,它也不足以达到RoR生产力。 仍然需要太多的技术和管道。

Grails可能是这张图片中缺少的,可以更接近RoR。 这是我的下一个实验。

顺便说一下,我的MDA经验与提高生产力相反,所以我不会提及它们(实际上,MDA正在扼杀我们的生产力)。

Javarebel可以大大减少使用Java进行Web开发所花费的时间。

我在这里引用官方网站:

JavaRebel是一个JVM插件(-javaagent),使您可以立即查看代码更改,而无需重新部署应用程序或执行容器重新启动。 如果您厌倦了观看日志,并希望看到您的更改以便继续前进 – JavaRebel是您最好的朋友。

讨论Java EE生产力时的一个重点:您应该使用Java EE 5和EJB3.x,因为与以前的版本相比,它们提供了更高水平的生产力(和function)。

保持标准Java EE规范是绝对重要的,例如使用Hibernate而不是JPA对生产力没有好处。 在使用JPA时,回归到Hibernatefunction没有任何限制,但是通过使用Hibernate而不是JPA,您将被锁定在单个持久性提供程序中而没有廉价的出路。 使用标准背后的整个想法是相同的:概念灵活性(通过插入不同的实现)具有可用的可扩展性(如果绝对必要,使用专有扩展)。 Java EE 5和EJB3是朝着这个方向迈出的重要一步。 当然,您希望最大限度地减少任何专有function,但如果某些function看起来绝对必要,那么它们将成为下一版本中规范的一部分的好迹象……

Java EE生产力的主要障碍在于其企业关注点(提供比大多数项目所需的更多)和其遗留(向后兼容性)。 在使用JSF和状态管理的表示层中还有很多工作要做 – 注意JSR-299以解决这些问题以及其他改进。

Grails是一个非常模仿Ruby on Rails的Java webapp框架,具有类似的原则(DRY,CoC)和生产力提升,但基于现有的Java框架(Spring,Hibernate和其他几个)。

我已经使用Grails进行了几个星期的探索性项目(之前没有Grails或Groovy的经验),我印象非常深刻。 有一些粗糙的边缘 – 它不像RoR那样成熟,但你可以快速得到结果,并且从来没有感觉框架妨碍你。

也许最好通过这个具体的例子来说明:我想在一个网页上编辑一个网格对象的二维数组,并发现生成的HTML请求数据自动映射到域对象(由Spring MVC提供,我相信)有一个错误导致一些数据被映射到错误的对象。 我在网上看了一个小时,但显然没有人遇到或解决了这个问题。 最终我决定放弃自动映射并“手动”执行 – 然后发现它花了我不超过10行代码……

人们经常提到RoR和基于动态语言的类似框架是更高效的环境,但我真的很想知道是否有硬数据支持这一点。 这并不容易,因为应该确保她不会将苹果与橙子进行比较。 应该考虑类似项目类型(Web 2.0,企业应用程序)和团队规模。 但是,对于小型项目而言,这些框架确实比Java EE更具生产力。 所以这是一个简短的参数列表,用于支持这一点以及您可以在Java世界中为它们做些什么。

Ruby是一种更直观,更简洁的语言。 你可以用更少的代码做同样的事情。

我不认为你可以在Java中拥有相同的东西,除非你当然使用在JVM(JRuby,Scala,Groovy)中运行的动态语言。 否则,您的IDE可以提供帮助。 在Jave中,IDE是一个必不可少的工具,如果你学会好好使用它(代码生成,代码片段,重构)它会回报你。 实际上,使用Java IDE可以做很多事情,使用Ruby或Python IDE根本无法做到。 此外,您还可以使用静态类型语言。 键入可能需要更多时间,但它可以帮助您避免常见错误。

Ruby使用起来更有趣。 使开发人员更快乐,更高效。

与上面相同。 但在我看来,这是一个非常主观的论点。

约定优于配置使事情变得更快

像Spring或Guice这样的dependency injection框架可以提供帮助

脚手架,MVC已经在你身边。

Java MVC框架再次提供帮助

数据库变得简单。 将数据库项加载为对象。 可以动态更改数据库。

Hibernate,iBatis或其他ORM框架可以提供帮助。 使用Hibernate Tools,您可以使用yml文件在RoR中实现类似的function

立即加载新模块

Maven或Ant Ivy可以提供帮助

易于部署测试

您的IDE或Jetty可以提供帮助。 事实上,Java调试更容易

测试与框架集成。 使用模拟对象便于测试

dependency injection框架可以帮助模拟对象。 JUnit是单元框架的先驱。 我认为Java不容易测试。

我肯定会和Hibernate一起为Spring提供持久性相关的东西。

为什么spring?

使用Spring而不是另一个框架的优势在于Springs的理念是“ 非侵入性 ”。 通常,当您使用框架时,您很可能会开始依赖于该框架,如果应用程序被认为运行的时间较长,然后您还要进行维护等,那么这可能是一个不好的问题.Spring使用了这样的框架。 – 称为“控制反转”(IoC)模式 。 基本上你的代码不会(它可以但不必)调用Spring,但Spring会打电话给你(好莱坞原则:“不要打电话给我,我会打电话给你”)。 因此,例如,您可以使用普通的POJO (Plain Old Java Objects),而不必从任何与框架相关的类/接口inheritance。 软件工程中的另一个大问题(如果不是最大的问题)是依赖关系。 你会尽可能地减少它们,因为它们会让你的生活更加艰难(特别是在以后的维护中)。 Spring通过配置文件和dependency injection模式管理组件的实例化, 从而大大减少了组件之间的依赖关系 。 我不想继续,最好的是你开始在Spring官方网站上阅读一些教程。 最初它可能需要一些时间来理解,但一旦你得到它,你将获得很多好处。

从Jython 2.5开始,您可以使用django来满足您列出的要求。 从django项目生成war文件并将它们部署在J2EE应用程序服务器上非常容易。

只是想提出另一个想法……你实际上可以使用JRuby和Rails(类似于之前关于Django和Jython的评论)。

如果您使用JRuby与Rails和JRuby Rack(可能还有一些其他实用程序……我不是最初实际进行集成的那个),您可以将JRuby Rails添加部署到现有的Java Web应用程序中。 我们有一个使用Tomcat部署的遗留JSP应用程序,现在开始使用Rails添加新页面(仅在必要时扩展JSP端)。 到目前为止它已经相当成功,虽然我们没有在Rails中实现任何主要的高流量页面,所以我不知道它将如何扩展。

我们拥有对会话的完全访问权限,甚至设置了从Rails页面调用JSP的机制(例如现有的页眉和页脚类型JSP包含)。 完全集成2需要一些努力和反复试验,但如果Rails和JRuby是一个选项,我强烈推荐它(作为Ruby的个人粉丝)。

一位同事涉足JBoss Seam,这是Gavin King(带给我们Hibernate的人)的一个框架,它的目的是模仿Rails。 看过这两个,我觉得Rails更容易开发。

使用AOP(面向方面​​编程)来实现日志记录,授权等交叉切割方面。您可以使用Spring AOP或AspectJ。 它使代码杂乱无章且易于维护。

我在过去几年里使用过Jboss Seam ,发现它是用Java EE开发的非常有效的方法(利用EJB3,Hibernate,Facelets)。 我也做了一些奇怪的PHP编码,可以老实说,我对Seam的效率更高(虽然这可能也表明了我的PHP技能。)

对我来说,有几个亮点是:

  • 热部署代码(绝对必备)
  • 用Facelets干
  • 基于注释的配置
  • 广泛的插入式组件(尤其是ajax4jsf)
  • Jboss Tools的IDE支持

IDE和命令行中有工具以与RoR类似的方式构建框架代码。

我会使用Scala编写的Lift框架 。 通过切换到Scala,您将看到极大的生产力提升。 Scala也非常稳定,从Scala代码调用Java代码非常容易。 不仅如此,它与Java非常相似,但增加了一些function。 对于某些示例,您应该参考Java开发人员需要了解的有关Scala的5件事。 Twitter将其部分代码库移至Scala。

你永远不会“卡在”一段代码上,因为你可以考虑如何在Java中编写它并编写类似的代码。 一流的function和演员将为您提供更高的生产力提升,并且都在Scala中。 Scala当然是静态类型的,其性能与Java类似。

我将引用Lift框架的作者来描述它:

提供借鉴最好的现有框架

  • Seaside的高度精细会话和安全Rails快速闪存
  • Django的“不仅仅包括CRUD”
  • Wicket设计师友好的模板风格(见Lift View
    第一)

而且由于Lift应用程序是用Scala编写的,这是一种优雅的新JVM语言,您仍然可以使用自己喜欢的Java库并部署到您喜欢的Servlet容器中。 使用您已编写的代码并部署到您已配置的容器中!

一些基本规则:

  1. 启动应用程序服务器 – 在转变和质量方面取得巨大成功。 如果必须,请保留Web容器,但在Spring和/或Hibernate中配置所有内容,以便web.xml最小化。

  2. 测试所有内容,由于步骤1,您现在可以执行此操作(不需要部署时XML或代码生成:所有内容都已在开发中配置)。

  3. 使用Wicket实现您的Web层 – 没有人需要JSP了; Wicket的效率提高了10倍,而且易于测试(参见步骤2)。

  4. 使用SCRUM和敏捷开发方法

结果是Java生产力高达4GL允许 – 我们在Atomikos有几个我们这样做的迁移项目。 因为我们从4GL平台迁移到Java / Java EE,所以我们可以比较两者中的估计值。

另请参阅此博客文章: http : //blog.atomikos.com/?p = 87

HTH

家伙

好吧,我不是一个真正的Java人,所以我不能说太多,除了…… JSF

我们试图使用它一段时间,这是一场灾难。 Almots所有基本步骤必须通过很多痛苦,没有文档,没有示例,没有社区知识。 我们使用了Eclipse的一个插件(Exadel Studio),我们看了一些其他JSF框架,它们都是不兼容的,文档很少。 事实上,在我们尝试过的所有内容中,只有Sun框架(忘记了它的名称,基于NetBeans)才能创建一个新的JSF项目,甚至可以开箱即用。 其余的需要多天配置apache和其他东西,对于没有经验的人来说这是一个真正的挑战(虽然我管理它)。

我们的团队花了几个月的时间用ASP.NET完成了几周后的工作。 人们对JSF和ASP.NET都缺乏经验。

如果JSF生态系统仍然像2007年一样糟糕,我建议完全避免它,无论如何,生产力是不可能的。 也许坚持使用JSP或经过时间validation并且发展良好的东西?