Java EE 6与Spring 3堆栈


90

我现在开始一个新项目。我必须选择技术。我需要一些东西,所以不需要EJB或Seam。另一方面,我需要带有IceFaces的JPA(休眠或替代)和JSF。

您是否认为在Spring 3上的Tomcat上部署这样的堆栈是一个不错的选择?还是Java EE 6 Web应用程序可能更好?恐怕Java EE 6是一项新技术,尚未得到充分记录。Tomcat似乎比Glassfish 3更易于维护。

你怎么看?你有经验吗?


8
如果您要轻便,我会去primefaces.org而不是IceFaces。它更快,API更精简。
谢尔文·阿斯加里

1
目前只有Glassfish提供JEE6。Resin正在缓慢实施JEE6 Web配置文件,根据您的需要,该配置文件对您而言可能就足够了。
托尔比约恩Ravn的安德森

3
@Thorbjørn如果只需要Web配置文件,则可以使用GlassFish v3 Web配置文件。
Pascal Thivent 2010年

@Pascal,要详细说明的是,如果您可以使用网络个人资料(我可以),那将很快有Glassfish的替代品来获得JEE6,而不是说Glassfish不能。
托尔比约恩Ravn的安徒生

@Thorbjørn我忘了删除@Thorbjørn:)该注释是针对OP的,这似乎是假设使用“全栈” GFv3是唯一的选择。
Pascal Thivent

Answers:


101

我需要一些东西,所以不需要EJB或Seam。

您是否愿意解释自EJB3以来使EJB变重的原因?您是否意识到我们已经不在2004年了?我真的很想阅读对light 定义和您的论点(并且我会很高兴地更新我的答案,因为我敢肯定我会说几句话)。

另一方面,我需要带有IceFaces的JPA(休眠或替代)和JSF。

Java EE 6 Web Profile(包括JSF 2.0,JPA 2.0,Bean验证,EJB 3.1 Lite,CDI等)非常适合此操作,您可以使用GlassFish v3 Web Profile来运行使用Java EE 6 Web Profile构建的应用程序。

您认为在Tomcat上部署的Spring 3上的此类堆栈是一个不错的选择吗?还是Java EE 6 Web应用程序可能更好?

好吧,喜欢在非专有平台(Java EE)而不是专有容器(Spring)上运行代码的想法。而且我认为Java EE 6足够好(这是委婉的说法,EJB 3.1(精简版),JPA 2.0,JSF 2.0,CDI踢屁股)。请注意,我是JSF的怀疑者,但我进行了第二次观察,带有CDI的JSF 2.0是如此不同,以至于我什至无法比较。而且,如果您不看CDI,那么我告诉您它确实很糟糕。

恐怕Java EE 6是一项新技术,尚未得到充分记录。

对我来说,Java EE看起来不错。这听起来像免费索取。而且,信不信由你,开始发现Spring变得越来越复杂,而Java EE变得越来越简单。

Tomcat似乎比Glassfish 3更易于维护。

你有尝试过吗?你有什么特别的问题吗?同样,这听起来像是免费索取。


2
我只是在用Drools,GraniteDS等在JBoss上使用EJB3.0 + Seam开发的评分器大型项目之后。我同意Seam的岩石!但是我花了50%的开发资源用于重新部署,重新启动服务器,部署错误,清理临时目录等。另一方面,JBoss Tools的性能确实很差(我的意思是-ctrl + space和10s挂起),这确实使我不鼓励使用JEE6看起来像是从Seam框架借来的。至于服务器,我不想考虑conconion池,jndi,jms,jmx,耳朵部署。我需要一些东西来启动WAR并在几秒钟内运行。
Piotr Gwiazda

6
@peperg Gaving King是CDI(焊接是RI)的规范负责人,因此您会发现Seam和CDI之间有相似之处。但是CDI!= Seam,Java EE 6!= Seam,您的看法是错误的。也许尝试使用GlassFish v3 Web配置文件,您会感到惊讶(一旦定义了连接池,就没有什么可担心的了)。
Pascal Thivent 2010年

8
人们说EJB很重是什么?我正在使用EJB v3.1,它们只是带注释的pojos。当他们说沉重的话,是指性能还是什么?
arg20 2011年

13
@ arg20-这确实是一个大问题,帕斯卡(Pascal)正确地要求解释在这种情况下“重”(或“轻”)一词的含义。很有可能,这是Spring和EJB之间的古老争执的剩余部分。在早期,EJB1和2在概念上很繁重。对远程处理和有状态bean的过分强调,可笑的冗长的XML部署描述符以及要实现的极其疯狂的必需接口数量给它们带来了非常糟糕的声誉。在EJB3(2006年)中,这已经完全改变了,但是在2004年离开EJB进入Spring的人们有时仍然认为它是2004年,而EJB2是最新的。
Arjan Tijms

7
请注意,在Spring的About页面上,它说:“我们相信:J2EE应该更易于使用”。请注意,他们使用的术语是“ J2EE”,而不是“ Java EE”,自Java EE 5发布以来,这是正确的名称(我认为)。这个不多说,大约他们...
维克托•席尔瓦E.索萨

32

我没有使用过JavaEE6。

但是,所有以前的JavaEE和EJB版本都让我感到非常震惊,直到我将其确立为事实上的标准,而不仅仅是法律上的标准,我才会信任它。现在,Spring仍然是事实上的标准。

骗我,是你可耻。愚弄我两次,羞辱我。愚弄我三遍,EJB。

有人会说Spring是专有的。我认为JavaEE规范的供应商实现是专有的,甚至更多。

最近,我经历了一次重大转变,将一堆Java应用程序从JBoss迁移到Weblogic。所有Spring / Hibernate应用程序都进行了零修改移植,因为它们内置了所需的所有库。所有使用JPA和EJB和JSF的应用程序移植起来都是一件麻烦事。应用服务器之间对JPA,EJB和JSF的解释之间的细微差异导致了各种讨厌的错误,这些错误需要永远修复。即使是JNDI命名之类的简单操作,在AppServer之间也完全不同。

Spring是一个实现。JavaEE是一个规范。那是巨大的差异。如果规范是100%气密的,并且供应商实施该规范的方式中绝对没有回旋余地,我宁愿使用规范。但是JavaEE规范从未如此。也许JavaEE6更加气密?我不知道。您可以在WAR中打包的内容越多,对AppServer库的依赖就越少,您的应用程序将具有更高的可移植性,这毕竟是我使用Java而不是Dot-NET的原因。

即使规范是不透气的,也能够在不升级我所有应用程序中所有技术堆栈的情况下升级应用服务器也是一件很不错的事情。如果要从JBoss 4.2升级到JBoss 7.0,必须考虑较新版本的JSF对我所有应用程序的影响。我不必考虑对Spring-MVC(或Struts)应用程序的影响。


1
确实,这是一个很好的理由。
Palesz'2

1
我同意这种推理,我遇到的许多问题都是依赖于容器规范的实现。嵌入式库带来的痛苦明显减少。在规范的哲学偏好之外,很难争论。
彼得·波特

精彩的推理。但是,即使在JEE 6之后,这也是您的经验吗?我了解规范的App Server实现仍然会很痛苦-因此,由App Server 1实现的相同规范可能是简单有效的,而对于App Server 2而言可能不是一个简单而有效的方法
-Soumya

1
+1。同样,应用服务器会根据Operations的时间表进行更改,其中spring / hibernate在开发人员的控制之下。在大公司环境中,升级应用服务器是一件大事。
内森·休斯

我并没有真正了解点网。它与Spring一样多,并且由Microsoft这样的单一供应商开发。可以解释一下吗?
user1339260 '16

23

没关系 Java EE 6足够好,并且由于那里有配置文件,因此它不是“繁重的”-您将只使用Web配置文件。

就个人而言,我更喜欢Spring。但是我对Java EE 6的理性争论不多了:)

(正如我的评论所提醒-您可能需要尝试RichFaces以及ICEfaces和/或PrimeFaces-取决于所需的组件)。


1
所以问题是:“使用全堆栈的Glassfish Application Server也使用Web配置文件是否有意义”?
Piotr Gwiazda

1
@peperg如果只需要Web配置文件,请使用GlassFish v3 Web配置文件,请参阅我的答案。
Pascal Thivent 2010年

我在此处stackoverflow.com/questions/2822812/spring-3-0-vs-j2ee-6-0/…上贴了一些论点,而不是从“如何将其投入生产”的角度出发。因此,这可能会填补您的论点。
奥利弗·德罗博姆

@ peperq,JBoss 6在假期期间发布。
托尔比约恩Ravn的安德森

17

最近,我的一位客户任务涉及评估Spring堆栈与自定义框架堆栈与Java EE标准。经过一个月的评估和原型制作,我不仅感到高兴,而且对Java EE 6功能集感到震惊。对于2011年及以后的任何新“企业”项目体系结构,我将使用Java EE 6和潜在的扩展,例如Seam 3或即将到来的Apache JSR299扩展项目。Java EE 6体系结构得到了简化,并融合了过去几年中发展而来的众多开源思想中的精华。

开箱即用地考虑以下功能:事件管理,上下文和DI,拦截器,装饰器,RESTful Web服务,具有可嵌入容器的集成测试,安全性等等。

我的大部分结果都发布在我的博客中解释了您可能会发现有用的Java EE 6的关键概念。

当然,选择框架没有硬性规定。Java EE 6对于不需要丰富会话状态的简单“网站”来说可能是be肿的。您不妨选择Grails或Play!框架。但是对于对话式Web应用程序,我看不出有一个更好的论点,为什么Java EE 6不太适合。


Java EE 6实在太慢了,glassfish和glassfish Web配置文件开始将它们与码头/ tomcat /任何东西进行比较时真的很慢。测试时,可嵌入容器也确实很慢。
Palesz'2

15

现在,一段时间后,我对堆栈有了经验:

  • Java EE 5 +接缝+ GraniteDS + Flex
  • 春季3 + Vaadin(在GWT上)
  • Spring 3 + JSF 2.0(PrimeFaces)

我的结论是:

  • Spring 3比Seam(几乎是Java EE 6)简单得多,并且可以在Tomcat和Jetty上运行!(使用Maven插件进行开发的Jetty是一种陷阱)。
  • 我喜欢Flex(我实际上是一个Flex开发人员很长一段时间,所以我有偏见),如果您需要丰富的界面并可以购买FlashBuilder,请使用它,但是请使用Spring + GraniteDS或BlazeDs后端。如果您不能购买FlashBuilder,请不要浪费时间。
  • Vaadin太棒了!开发过程比Flex简单,但是您可以轻松创建丰富的应用程序而不会造成HTML混乱。您不会写单行的JS行。您只需要一些CSS(在Flex中,您也需要它)。因此,如果您的应用程序界面的行为类似于桌面应用程序,并且您不能(或不想)使用Flex,请使用Vaadin。警告!Vaadin对浏览器来说有很大的JS开销。
  • 如果您创建更简单的类似网站的应用程序,请使用JSF2.0(具有如上所述的spring后端)。您需要与HTML对抗(我讨厌它),并且创建丰富的界面比Vaadin(尤其是布局)要困难。对于较慢的浏览器/计算机,您将获得轻量级的HTML。我喜欢PrimeFaces-它很容易并且有据可查。第二名是IceFaces
  • 如果您创建了一个网站(而不是Web应用程序),需要在其中添加生命(而不是创建适合浏览器的企业应用程序),请使用Wicket(如果您喜欢基于组件的方式,请采取态度)或SpringMVC(如果您希望基于模板的则是) ,推动态度)或只使用Play!框架。请记住,创建丰富的基于数据的组件会困难得多,但是您将可以控制html的每个标签(您的HTML / Graphics设计人员会喜欢的)

21
我看不出您自己的答案与该问题
有何关系

1
-1接受这个答案似乎非常不合适,因为它甚至没有提到Java EE6。而且,它也没有解决@Pascal Thievent的深思熟虑(以及更高的选票)中提出的任何观点。回答。
user359996 '02

1
其实问题并不更有效。JEE 6现在非常成熟,并不是在2010年3月有人问这个问题。
Piotr Gwiazda'3

从那时起,@ PiotrGwiazda以何种方式改变了JEE 6?人们更害怕它,但今天,它基本上是相同的JEE 6
ymajoros

1
我的意思是JEE6实现更加成熟且可用。JBoss 7现在很稳定,并且有更多的实现方式。社区现在也更大。现在,更多工具和库都支持JEE 6堆栈。
Piotr Gwiazda 2012年

8

阅读亚当·比恩(Adam Bien)的《企业Java未来...很清楚》(Java EE带有/不带有Spring和Vice Versa),其中包括获得硬币两面的评论。我将出于多种原因选择Spring,以下是其中之一(复制帖子中的评论之一)

'我不确定您在谈论哪个Java EE 6服务器。有Glassfish认证和TMAX JEUS。直到Java EE 6兼容版本的WebSphere,WebLogic,JBoss等投入生产并可以用于实际应用之前,要花相当长的时间(阅读:几年)。Spring 3只需要Java 1.5和J2EE 1.4,因此几乎可以在几乎所有环境中使用。


6
差不多一年后的今天,支持Java EE 6的JBoss AS 6目前正在生产中使用。
2011年

8

我的意见基于其他人未提及的内容,即我的工作中的代码往往存在数十年(实际上),因此维护对我们非常重要。维护我们自己的代码以及我们使用的库。我们控制着自己的代码,但对我们而言,我们使用的库在上述几十年或更长时间内由其他人维护也符合我们的利益。

长话短说,我得出的结论是,实现这一目标的最佳方法是使用Sun规范的开源实现,一直到原始JVM。

在开源实现中,Apache Jakarta已被证明可以维护其库,最近,Sun在为Glassfish v3生成高质量实现方面做了很多工作。无论如何,我们还拥有所有模块的源代码,因此,如果所有其他模块都失败了,我们可以自己维护它们。

Sun规范通常非常严格,这意味着可以轻松互换符合该规范的实现。看看servlet容器。

在这种特殊情况下,我建议您仅看一下JavaServer Faces,因为它是Java EE 6的一部分,这意味着它将在非常非常长的时间内可用和维护。然后,我们选择使用MyFaces Tomahawk进行增强,因为它提供了一些有用的补充,并且这是一个雅加达项目。

JBoss Seam或其他产品没有任何问题。只是他们关注的重点不再是对我们如此重要的维护问题。


原来的Java ServerFaces 2 Java EE 6中可能对自己做什么,我们需要战斧与JSF 1.这是一个相当有能力的框架(但有点XML重)
托尔比约恩Ravn的安徒生

遗憾的是,很重要的一点是,人们往往忘记了软件已经可以生存数十年了,长期支持是关键。
timmz 2015年

6

如果您已经拥有Spring,那么我可以看到它,但是对于新项目,有什么意义呢?我将直接使用Java EE 6(ejb3,jsf2.0等)

如果客户对Flex满意,那就去做吧。使用BlazeDS或类似工具-无mvc。您可能会在这方面花费更多的时间(在服务器和客户端之间交换数据),但是您可以完全控制双方。

除非您想杀死浏览器,否则请不要使用Vaadin。此外,一旦页面变得更加复杂,您将花费更多的时间来处理代码。另外,您的思维方式将需要完全改变,您对标准前端开发所知的一切都将浪费。不必使用HTML或JS的说法没有多大意义。即使不使用它,您仍然必须知道它。最终将其呈现为HTML和JS。然后尝试对其进行调试-确保您有几天时间来学习简单的东西。另外,我无法想象不了解html / js的网络开发人员。

我只是不明白为什么人们尝试所有这些抽象而不是直接使用Java EE。


5

为什么在2010年仍然有传言称EJB重量级?似乎人们并没有在Java EE技术上得到更新。只需尝试一下,您将惊喜地发现Java EE 6中如何简化这些事情。


4

问题的答案取决于您的项目要求。如果您不需要Java EE功能(例如消息队列,容器管理的全局事务等),请使用tomcat + spring。

从经验中我还发现,需要大量Web服务集成,调度,消息队列的项目最好使用某些Java EE堆栈来完成。好消息是,使用spring仍可以与在应用程序服务器中运行的Java EE模块集成。

Java EE 6与以前的版本有很大的不同,它确实使一切变得更加容易。Java EE 6结合了来自不同Java社区的最佳创意,例如Spring框架的Rod Johnson积极参与了Java EE 6中的依赖注入JSR的制作。使用Java EE 6的好处是您可以根据标准,这在某些组织中对于供应商支持等可能很重要。

GlassFish v3支持Java EE 6,而且重量轻,并且启动速度非常快。我一直在使用glassfish v3进行开发,并且配置起来非常容易。它带有一个非常用户友好的管理控制台,可让您以图形方式管理服务器。

如果您使用的是GlassfishV3和JSF 2,则可以利用Java EE 6的CDI功能,该功能使您可以轻松地在JSF中创建对话(例如页面之类的向导)。

话虽如此,使用Java EE 6还需要您学习新的API。根据可用的时间范围,它可能不是您的最佳选择。Tomcat已经存在了很长时间,并且tomcat + spring组合已被许多Web项目采用,这意味着周围有许多文档/论坛。


我不同意您的第一句话,选择不是关于使用JMS。而且我认为JSR-330在Java EE 6中没有那么重要(出于政治原因而更多),重要的部分是JSR-299(CDI)。至少,这是我的看法。
Pascal Thivent 2010年

同意有一些涉及JSR330的政策-尽管如此,它非常重要,因为它为Java(SE或EE)中的依赖注入提供了通用基础,而不是将DI变成仅JEE的技术。而且,Spring框架和Google Guice支持它,这意味着它将使Spring / Guice代码易于移植到JEE6,反之亦然。JSR299还旨在扩展JSR330的功能。您是正确的,对于JEE6中的Web应用程序,JSR299绝对至关重要。由于这两个JSR,JEE6和Spring都具有非常相似的编程模型。感谢您的评论!
拉兹

3

我曾经在Spring和Java EE 6中工作过。根据我的经验,我可以说的是,如果您打算使用旧的JSP或专有的Flex,那么在Spring办公的话,您会很安全。

但是,如果您要继续使用JSF,那么是时候转向Java EE 6了。使用Java EE 6,您将转向Facelets以及标准化的脚本库和组件库。不再有脚本不兼容和组件库矩阵。

关于Spring MVC,只要您的项目规模不会太大,就很好。如果是大型企业应用程序,请坚持使用Java EE6。因为这是您可以有序维护自己的组件库和资源包的唯一方法。


1
谢谢你的评论。我的选择是Spring + Vaadin。
Piotr Gwiazda'7年

3

如果需要Java EE完整堆栈,建议您使用GlassFish 3.1。与实现了部分或全部Java EE 6(JBoss 6,WebLogic 10.3.4)的其他Java EE容器相比,它的启动速度非常快,重新部署需要几秒钟的时间,并且几乎所有操作都可以通过约定进行配置,这非常友好。

我想要“轻巧”的东西,您可以自定义具有所需功能的Apache Tomcat7.x。我在以下库中使用很多:Weld 1.1.0(CDI)JPA 2.0(Hibernate 3.6.x)-仅资源本地事务JSF 2.x(Mojarra)RichFaces 4.0 BIRT运行时

在过去的10年中一直是Java EE开发人员(我曾受过早期的EJB,JSF和Web技术的困扰),Java EE 6非常容易,耦合良好并且当前的硬件运行平稳,因此激发Spring的原始原因不再有效。


1
我喜欢你的回答。很合理 当我发布问题时,JEE6还很年轻,而Tomcat 7尚未完成。“激励Spring的原始原因不再有效”-的确如此,但是带有CDI的JEE6需要一些时间来解决。例如:Javamelody监视可用于Spring和Guice(没有它,我无法想象会在应用程序上烦恼)。EHcache可用于Spring(我的意思是缓存方法的结果)。在Spring中,诸如方面编程之类的许多事情仍然比较容易,因为许多第三方库和框架可以轻松地与Spring集成,但尚未与JEE6集成。
Piotr Gwiazda,2011年

1

我还是更喜欢Spring。

而且我会通过JSF。我认为这是一项过时的技术。Spring MVC将是更好的选择。Flex也是如此。考虑合同优先的XML服务,您可以将后端与UI完全分离。


1
我已经使用Java + Flex和PHP + Flex创建了一些应用程序,并且我同意这是丰富接口的最佳解决方案。但是,在这个应用程序我不能使用Flex :(我需要尽管一些高层次的接口,所以Spring MVC是不是一个解决方案,我要考虑排序的数据表或者比<TR> <TD>在一个循环。
彼得Gwiazda

1
@duffymo-我可以争论一下flex是否是一个不错的选择。JSF绝对不会死,尤其是周围有诸如richfaces,primefaces,icefaces等库。
博佐

1
在IceFaces中,我创建菜单,树,数据网格使用操作,事件,并且我不认为页面是否重新加载或ajax请求。可排序的datagrid或ajax加载的树是内置组件。在Spring MVC中,我对HTML(表格,列表等)进行操作。我需要使用一些第三方javascript框架并手动创建AJAX魔术。我想在Flex中执行此操作,但这是一项政治/业务决策-不是我的。
Piotr Gwiazda

1
我目前的两个JSF项目肯定没有死;)而且,我对使用RSF构建RIA的JSF方法(使用“ richfaces”中的“ rich”表示满意)比使用Flex更满意。一个甚至在下周公开发行。
博佐

2
我真的很想知道为什么您仍然喜欢Spring,Java EE 6很好。您不认为在开放平台上运行对Java的未来很重要吗?
Pascal Thivent 2010年

0

我建议使用Spring + Tomcat,除非您可以等待Glassfish v3和Weld变得更成熟的时间。使用启用了CDI的应用程序运行glassfish时,当前在内存消耗/ CPU负载方面存在一些问题。


0

并没有阅读所有内容,只是告诉您现在可以在Java EE 6战争中使用EJB3,以便可以在Tomcat上使用EJB3(我认为)。


是的,您可以在Java EE 6中的WAR中打包EJB,但这并不意味着您可以在Tomcat上部署这样的WAR。您需要一个实现Web Profile的容器,而Tomcat则不需要,而Tomcat社区中实际上没有实现它的计划(请参阅old.nabble.com/Java-EE-6-Web-Profile-td27715793.html)。但是这里有GlassFish v3 Web配置文件,会有树脂...
Pascal Thivent 2010年

2
更新:看一下TomEE +项目tomee.apache.org/apache-tomee.html
gpilotino

-3

我向您推荐使用Spring的Tomcat,因为:

  1. Spring可以为JSP创建支持bean
  2. 您将使用Spring通过JPA持久化对象

选择Tomcat是一个不错的选择,因为您不需要任何重量级的处理


1
“重量级处理”?你能详细说明吗?我很好奇。
Pascal Thivent 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.