Mojarra和MyFaces的区别

48

我正在学习JSF2.0,参考了一份教程,但是我有以下问题:

这个教程仅使用了两个库:jsf-api.jar, jsf-impl.jar以及来自Mojarra Project的JSTL。

我尝试下载它们,但似乎该网站无法访问。因此,我使用了Apache MyFaces,但是为了运行示例,我必须添加8个库(commons-*myfaces-*)。

如果我使用MyFaces,为什么需要更多的库呢?我应该选择更轻量级的Mojarra吗?另外,下载页面确实是JSF Mojarra吗?

谢谢


11
这个问题非常有建设性。 - Koray Tugay
7个回答

74

如果我使用MyFaces,为什么还需要更多的JAR包?

因为这些commons-*依赖项未捆绑在MyFaces中。另一方面,如果您正在使用来自Apache.org的其他库,这些库也使用这些commons-*依赖项,则最终您将获得更小的总大小库。

应该注意的是,自Mojarra 2.1.6以来,已经提供了单个JAR文件格式javax.faces.jar,自Mojarra 2.3.9起重命名为jakarta.faces.jar


我应该选择Mojarra作为更轻的选项吗?

这不是一个问题。你应该看看JSF实现的健壮性和维护情况。

Mojarra的前身Sun JSF RI 1.0和RI 1.1的早期版本存在许多严重的错误。在那个时候(大约在2004-2006年),MyFaces明显是更稳定的选择。

自从2006年初的1.1_02和1.2_02以来,新的Sun/Oracle JSF开发团队做了很好的工作。不仅修复了错误,还进行了性能优化。在Mojarra 1.2寿命的一半左右(大约在2007-2009年),Mojarra比MyFaces更好的选择。

自从 JSF 2.0 推出了新的部分状态保存管理,MyFaces 在性能方面是更好的选择,因为它采用了一种不同且更高效的方法来计算状态增量,特别是在使用大型组件树时。Mojarra 直到版本 2.1.22 才迎头赶上。在 2.0/2.1 时间轴上,Mojarra 只有在复杂/嵌套构图中遇到 <ui:repeat> (例如,破损的状态保存、仅处理最后迭代的表单、失败的 <f:ajax> 等) 和 flash 范围实现 (最初的实现完全没有防护措施) 这些严重问题,而 MyFaces 也有其自己的一套 bug,但它们是可管理的。

目前,使用JSF 2.2时,我们无法预先确定哪个实现更好。错误通常要在后续才能暴露出来,而鲁棒性只能在事后进行评估。只需选择您“感觉”最好的实现即可。浏览他们的问题报告(MyFacesMojarra),了解以前修复的问题和当前未解决的问题。如果遇到特定的错误,请尝试使用两种实现来排除其中之一。必要时报告,以保持两种实现的整体质量高。


下载页面确实是 JSF Mojarra 吗?

他们的主页已经移动了几次。目前(2019年11月)位于 https://eclipse-ee4j.github.io/mojarra。您也可以在Maven Central中找到org.glassfish:jakarta.faces。您可以在GitHub的eclipse-ee4j/mojarra项目中找到源代码。


参见:


balusc - 你介意更新一下你的回答吗?我看到你和mojarra团队合作过。你的回答已经快一年了...这对我来说很重要,因为我的团队想把一个1000多页的业务应用从myfaces 1.2迁移到JSF 2...我有点不情愿,因为我们不得不修复JSF 1.2的多少个bug以及花费了多长时间。 - Toskan
8
我不为Mojarra工作,只是广泛使用它,并且是Mojarra的积极Bug报告者。我不认为需要做出什么改变。如果你已经在使用MyFaces,请继续使用它,除非你遇到一个严重的MyFaces特定问题,而这个问题在Mojarra中没有表现出来。 - BalusC
那感觉有多少漏洞?你建议从1.2升级到2吗? - Toskan
截至2023年,我们现在有Jackarta Faces、Mojarra和MyFaces更新到了4版本(很快会有4.1版本,然后是5版本)...这些实现之间有什么区别?你能否更新你的回答? - undefined

45

以下内容来自我的博客:

http://lu4242.blogspot.com/2011/06/10-reason-why-choose-myfaces-core-as.html http://lu4242.blogspot.com/2012/05/understandingjsf-2-and-wicket.html

更新于2013年7月:请参阅JSFCentral网站上的一系列文章和2013年的更新:

http://www.jsfcentral.com/articles/understanding_jsf_performance_3.html


乍一看,MyFaces和Mojarra这两个JSF实现相同,因为它们都基于同一个标准。你可以从一个实现切换到另一个实现是JSF规范质量的体现。

但在底层,MyFaces Core 2.x比Mojarra更优秀很多。注意我是MyFaces项目的提交者,所以我在这里只提供我的观点:

  • 已解决了很多问题。仅在2.0.x分支中,从2.0.0-alpha到2.0.7,共解决了835个问题。这是社区提供的贡献和反馈的“生”度量标准。以下是随时间关闭的问题数量:2.0.0-alpha:274、2.0.0-beta:58、2.0.0-beta-2:41、2.0.0-beta-3:39、2.0.0:51、2.0.1:148、2.0.2:77、2.0.3:63、2.0.4:23、2.0.5:27、2.0.6:29、2.0.7:5。

更新于2012年5月: 2.1.0:47、2.1.1:6、2.1.2:84、2.1.3:9、2.1.4:74、2.1.5:7、2.1.6:35、2.1.7:52

  • 社区至上:MyFaces社区拥有许多对JSF非常熟悉的人才。订阅用户和开发者邮件列表是了解最新动态、接收反馈并认识其他对JSF感兴趣的人的最佳途径。请参见MyFaces邮件列表

  • Apache以优化Sun/Oracle的技术而著称。在这种情况下,MyFaces Core对部分状态保存、组合组件等方面进行了一些很酷的优化!。

  • MyFaces Core与OSGi兼容。它提供了一些SPI接口来处理特殊设置,当您需要更多的类加载控制时使用。

  • MyFaces Core与facelets 1.1.x更兼容!只需将org.apache.myfaces.REFRESH_TRANSIENT_BUILD_ON_PSS网页配置参数设置为true,一个特殊模式就会被激活。不再出现破碎的c:if标签或c:forEach或ui:include!2012年5月更新MyFaces Core内部完成了改进算法,即使在使用facelets动态更新组件树时也可以减少状态大小。这个参数不再必要。

  • MyFaces还有其他项目(Trinidad、Tobago、Tomahawk、ExtVal、CODI、Orchestra、PortletBridge RI等),这些项目测试MyFaces Core,帮助保持代码整洁,一旦出现bug,则可以更快地处理。

  • 您可以使用svn签出并轻松构建任何MyFaces项目,因为它们都是基于maven的,大多数IDE提供maven支持。

  • 目前(2011年6月),Mojarra存在与状态保存相关的讨厌bug,而MyFaces由于其实现方式完全不同,所以不会出现这种情况。事实上,MyFaces局部状态保存算法比Mojarra与JSF 1.2状态保存更兼容。但请注意,Mojarra开发人员正在解决此问题,但修复需要数月甚至数年。

  • 创新发生在MyFaces上。

  • 2012年5月更新

    请参阅本文为Web应用程序选择MyFaces Core作为JSF实现的十个理由

    对于那些想要查看MyFaces、Mojarra和Wicket性能比较的人,请看了解JSF 2和Wicket:性能比较

    2013年7月更新

    比较范围扩展到包括Spring MVC、Tapestry、Grails 2和Wicket等其他框架。请参阅JSFCentral上的文章:2013年7月更新于JSFCentral


    如果你要从其他地方复制粘贴内容,那么你需要正确地注明出处。 - Kev
    我回滚了编辑的内容,似乎有人试图发布垃圾信息。 - lu4242
    你为什么要回滚这个版本?你把它从别人的网站上复制粘贴过来,因此需要适当的归属。 - Kev
    15
    @Kev,看起来Kumar的博客是复制粘贴。lu4242的博客和这个答案都早于它。请参阅http://meta.stackexchange.com/q/169699/1288上的讨论。 - Bill the Lizard
    我选择了MyFaces,独家原因是它可以与mvn tomcat7:runtomcat:run一起使用(.xhtml文件可编辑/刷新)。这对我们公司来说是一个决定性因素。 - acdcjunior

    9
    我认为这并不重要。
    最近,我开始使用Myfaces和Primefaces进行JSF 2.0项目。上周,为了调查一个错误,我尝试在Mojarra上运行它。只需要交换JAR文件并删除web.xml中的Myfaces特定条目 - 一切都可以正常工作,没有任何问题。不可否认,这是一个原型,没有使用所有JSF功能,但我对这种通过符合标准实现兼容性的演示印象深刻。
    为什么如果我使用MyFaces还需要更多的JAR文件?
    - myfaces-impl和myfaces-api JAR文件相当于Mojarra的jsf-impl和jsf-api。 - myfaces-bundle包含这两个文件,供您方便使用,您只需要其中之一,而不是三个都需要。 - commons-*是包含有用的基本功能(如处理集合、Java bean等)的库,否则可能需要重新实现(可能速度更慢且出现更多错误)。许多其他项目也使用这些库。

    5

    通常情况下,除非有其他原因需要使用其他的JSF实现,我会坚持使用Mojarra。我使用Netbeans,所以最容易使用的是“默认”项目设置,它使用在GlassFish下运行的Mojarra。

    上次我使用MyFaces是因为我考虑使用Tomahawk,而且使用来自同一源的JSF实现似乎是合理的。但是,我已经转而使用Primefaces,它在Mojarra下运行良好。

    现在,JSF-2.0组件库正在涌现,似乎有很多开发正在进行中。因此,您应该学习并能够在JSF实现之间切换,以防出现问题。

    MyFaces拥有更多JAR文件的原因是它具有比参考实现更多的功能。


    2

    1

    Mojarra和MyFaces之间没有太大的区别。您可以检查哪个是更稳定的版本。正如Balusc所说,MyFaces是最稳定的版本(在2005-2006年)。此外,许多人在2.0之后开始使用Mojarra,因为它相对于myfaces变得更加稳定。


    1

    我在使用mojarra (2.2.8)时遇到了严重的头痛,出现了奇怪的行为,例如由于先前的表单更新,ajax方法只会在第二次用户交互后才运行。使用MyFaces后,所有问题都解决了。


    不是在抱怨,而是真诚地寻求澄清:您如何知道这是Mojarra的问题(哪个版本),而不是您做错了什么,导致Mojarra因为正当原因而失败,而MyFaces不合规地接受了违反规格的东西?还有,出现了什么错误?您是否已经提交了错误报告? - Kukeltje
    人生苦短,不要只是提交错误报告(开个玩笑)。嗯,我“相信”这是一个Mojarra的bug(虽然找不到官方的错误报告 - 只有这个:https://dev59.com/R2gu5IYBdhLWcg3wUlnt#11412138)。也许在2.3以上的版本中已经修复了(我使用的是2.2),我应该在发布这个答案之前更新我的pom.xml,就像你建议的那样。但是请给我打个折扣,昨天晚上太晚了,我已经浪费了6个小时来解决这个问题。稍后再测试一下,如果我可以通过升级Mojarra库来解决问题,我会发布更新的。 - Mateus Viccari
    好的,谢谢。但请记住,2.2和2.3是JSF API版本。Mojarra是2.2.0、2.2.1、2.3.0等等。 - Kukeltje
    这有点尴尬,但我试图升级到最新版本(2017年6月)即2.3.2,但是......错误仍然存在。无论是错误还是用户(就是我)搞砸了,我不能肯定地说......所有我知道的是代码看起来没问题。但是在MyFaces中没有发生这种情况,所以我想我得坚持使用它。 - Mateus Viccari
    可以理解,但你的情况应该是一个带有 [mcve] 的新问题,否则对其他人来说并不是很有帮助(而且我们也无法可能提交错误报告)。 - Kukeltje

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接