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

时间:2009-03-14 10:39:29

标签: java performance java-ee web-applications

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

约束是:

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

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

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

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

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

14 个答案:

答案 0 :(得分:49)

答案 1 :(得分:6)

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

Grails可能是这张照片中缺少接近RoR的缺失部分。这是我的下一个实验。

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

答案 2 :(得分:5)

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

我在这里引用官方网站:

  

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

答案 3 :(得分:3)

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

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

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

答案 4 :(得分:2)

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

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

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

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

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

约定优于配置使事情更快

像Spring或Guice这样的依赖注入框架可以提供帮助

脚手架,MVC已经为你而存在。

Java MVC框架再次提供帮助

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

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

立即加载新模块

Maven或Ant Ivy可以提供帮助

轻松部署测试

您的IDE或Jetty可以提供帮助。事实上,使用Java

可以更轻松地进行调试

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

依赖注入框架可以帮助模拟对象。 JUnit是单元框架的先驱。我不认为Java不那么容易测试。

答案 5 :(得分:2)

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

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

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

答案 6 :(得分:1)

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

为什么选择春天?

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

只是想提出另一个想法......你实际上可以使用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更易于开发。

答案 9 :(得分:1)

使用AOP(面向方面​​编程)进行日志记录,授权等交叉切割。您可以使用Spring AOP或AspectJ。它使代码混乱,可维护。

答案 10 :(得分:1)

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

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

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

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

答案 11 :(得分:0)

我会选择用Scala编写的Lift framework。通过切换到Scala,您将看到极大的生产力提升。 Scala也非常稳定,从Scala代码调用Java代码非常容易。不仅如此,它与Java非常相似,但增加了一些功能。对于某些示例,您应该参考5 Things a Java developer needs to know about Scala. Twitter将其部分代码库移至Scala。

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

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

  

提升借鉴现有的优势   框架,提供

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

因为Lift应用程序是   用Scala编写,一个优雅的新JVM   语言,你仍然可以使用你的   最喜欢的Java库并部署到   你最喜欢的Servlet容器。使用   您已编写的代码和   部署到你已经拥有的容器   配置!

答案 12 :(得分:0)

一些基本规则:

  1. Kick out the appserver - 在转变和质量方面取得巨大成功。如果必须,请保留一个Web容器,但在Spring和/或Hibernate中配置所有内容,以使web.xml最小化。

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

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

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

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

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

    HTH

答案 13 :(得分:-1)

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

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

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

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