Eclipse Webtools项目(WTP)及其性能/质量

54

我们公司使用Eclipse已经有好几年了(自从发布0.7版以来我们一直在使用WTP)。

我目前正在评估Eclipse 3.6.2和WTP 3.2.3,这应该取代Eclipse 3.4.2和WTP 3.0.4成为我们的主要IDE。

但我必须说,我对性能感到非常失望:
WTP 3.2.3似乎比3.0.4慢得多。
实际上,我真的很想知道为什么每个版本WTP都会变得更慢。

我们的一个应用程序(动态Web项目)包含约4000个Java类和700个JSP / JSP片段。我们只需要基本的WTP功能来开发JSP,XML和XSD。我们不需要像Dali(JPA工具真的应该由 Webtools项目覆盖吗?)、Libra可视化XML编辑器等高级功能。

另一个有趣的问题是,WTP似乎减慢了整个IDE的速度。 SWT在某些情况下无响应,CPU使用率非常高(特别是在构建完成后 - 如果查看系统作业,则会看到几个JSP / JavaScript索引器正在工作几分钟,即使所有WTP构建验证器都已禁用),打开新文件较慢,浏览项目等。

这在只包含单核 CPU 的老机器上尤其明显。

最糟糕的是,我感觉 WTP 开发团队对性能不太关心(例如,看看http://wiki.eclipse.org/WTP_Performance_Tests页面 - 最后更新于2008年)。

关于基本功能(例如 jsp 编辑/验证)的性能问题的 Bug 报告和新闻组帖子经常被忽略或在一段时间后关闭,以下是一些例子:here, here, and here

Quo vadis, WTP?


请不要误解:

我并不想责备WTP。
实际上,我相信WTP是由一支才华横溢的团队开发的优秀开源项目。
但显然,该项目在质量保证方面存在问题,特别是性能方面,这影响了可用性和用户接受度。

我只是想指出,团队应该首先关注对大多数用户来说最重要的事情,然后再着手实现超级棒的功能。

我的问题

  • 你对WTP有什么经验,特别是最近的版本?
  • 你能否证实或反驳我的观察结果?
  • 有更好的替代品吗?
  • 你是否从WTP转换或转向,为什么?
  • 你有一些最佳实践来加速它,特别是对于像我们这样的中等规模企业吗?

更新

我想更新一下这个问题,以反映当前的答案并总结当前的结果:

  • 许多用户抱怨几乎相同的问题,因此我认为这些问题已得到确认。
    顺便说一句,这个问题也在theserverside.com上的新闻帖子中提到,并附有其他评论。

  • 负责WTP项目的领导nitind就WTP的当前情况发表了值得注意的帖子,我想引用一下:
    "事实是我们没有花费太多时间进行性能测试,因为我们缺乏这方面的资源。"
    "当然,我们希望采取主动措施而不是被动应对,但我们往往先将时间分配给功能问题。"

因此,这个问题变成了某种程度上来自社区的公开信,写给WTP团队:

Dear WTP team,

it's obvious that WTP is suffering from major quality/performance issues 
which you try to play down or to ignore.
Please invest some time to improve the current situation 
at the cost of new features and do everything what's required 
to solve the current problems.
E.g. revive the performance team, do some regression tests between 
previous releases or ask the community for (precise defined) help.

I am sure that they are enough people willing and able to help here.

If you like, do some kind of poll to get a feeling what should be 
the most important scopes of future's WTP releases.

Please, please, listen to your community.

你尝试过在Eclipse论坛/新闻组上发布你的问题吗?另外,检查一下Bugzilla,看看是否有人提出了任何性能方面的问题? - katsharp
1
@kett_chup 是的,我创建了一些与性能相关的错误,并在一段时间前向邮件列表表达了我的担忧。但是WTP开发人员似乎更多地忽略了这种情况。我得到的答复是“解析jsp文件是一件复杂的事情”,而不是“好的,我们将进行一些分析工作以查看是否存在问题”。我创建了这个stackoverflow问题,以了解是否只有我遇到了这种与WTP相关的问题。我认为WTP团队应该在下一个版本中集中精力提高性能,而不是添加新功能。 - MRalwasser
好的 :) 我没有太多使用WTP的经验,所以我无法发表评论。 - katsharp
哎呀!这变得越来越糟了。等待20分钟保存30行xhtml文件的情况经常发生。有时候在尝试编辑jsf文件时,IDE会冻结超过5分钟。完全不酷…… - mondjunge
有趣的文章(不幸的是只提供德语版),关于 Eclipse 的当前问题(以及可能的未来):http://www.heise.de/developer/meldung/Kommentar-Wohin-steuert-Eclipse-2039088.html - MRalwasser
显示剩余4条评论
11个回答

32

为了回答您的问题,我是WTP项目中供应JSP、XML和JavaScript源代码编辑功能的项目负责人。事实是我们没有花很多时间进行性能测试,因为我们缺乏这方面的资源。当然,我们希望能够预防性地解决性能问题,而不是被动应对,但我们倾向于先将时间分配给功能问题。我们确实有一个采用者产品定期运行性能回归测试,但我预计现在这些测试已经在多核机器上运行了,而且我们已经有一段时间没有收到新的红旗报告。

在您提供的3个错误中,有2个早于您称赞的3.0.4版本,第三个则是格式化性能问题(已得到解决),或者是特定于XML文件的即时验证问题(如果修复这个问题,将会触发Xerces的内存泄漏,因此我们当时没有进行修复)。如果您有具体的项目可以附加到错误中,并说“在3.2版本中,执行X操作比Y慢”,我们会尽力找出是否存在回归问题。

至于索引器,它们至少应该最终完成。存储的磁盘信息在WTP版本之间已经发生了变化,这些文件需要重新处理,以便它们再次包含在搜索和(如果实现)重构操作中。一旦初始索引完成,它应该是逐步增量的,几乎不会被注意到。您可能遇到的一个架构变化是,对于JSP,需要在单个工作台会话中对整个工作区进行索引,才能将该索引视为“最新”。出于挫败感而关闭Eclipse只会延长重新处理的影响。

听起来您公司的标准安装包含整个WTP而不是您自己的定制版本。我建议您检查启动和关闭首选项页面,并关闭您不感兴趣使用的任何功能的早期启动。您提到的任何内容都不需要使用该功能,但WTP和平台的其他领域可能需要。在验证首选项页面上可以对您不感兴趣的任何内容进行验证,以及在Web/JSP文件/验证首选项页面上设置默认验证JSP片段。


1
感谢您的评论和提示。请注意,提到的索引器只是问题的一个例子。即使它们完成了(使用进度视图进行验证),问题仍然存在:保存/打开文件较慢,在闲置时 CPU 使用率较高等。这已经由不同的开发人员在不同的机器上进行了验证,正如您通过查看其他评论所看到的那样,似乎我们并不是唯一遇到这些问题的人。所有验证器都已禁用,否则构建将需要超过30分钟(仅启用JSP语法验证器)。 - MRalwasser
保存肯定不应该更慢,构建触发的验证也不应该阻塞构建本身。只安装了WTP及其先决条件吗?在空闲时是否仍有剩余的系统操作在进度视图中运行?如果在结构化文本编辑器页面上关闭代码折叠,是否会有所不同(一旦我们使其停止阻塞UI,它就是默认启用的)? - nitind
1
自从WTP 3.2.3以来,我们经历的另一件事情是每次更改jsp时,都会运行一个系统作业数分钟:“System_Decoration Calculation - Caluculating Decorations: Decorating xyz”其中xyz是我们的jsp所在的顶级文件夹 - 它是做什么的,为什么要运行这么长时间和频繁?我们有时还会看到另一件事情:“将资源复制到输出文件夹”,尽管启用了“不发布即可服务模块”。 - MRalwasser
对于装饰,我猜测某个东西(可能是资源管理器视图?)正在调用其内容的标签装饰器。它们应该可以在“常规”/“外观”/“标签装饰”下进行配置,而我对那些似乎默认启用自己的数量持怀疑态度。 - nitind
至于“无需发布即可提供模块”选项,它仅在从WTP运行/调试应用程序时防止将文件复制到工作区的.metadata目录中的Web应用程序分置位置。这可能与其无关,可能是Java Builder将非.java源文件(如.properties文件、图像)复制到bin文件夹中。 - nitind

5
我们在这里也遇到了WTP 3.2.3的同样问题。我们已经使用它多年,但是开发人员和客户对这个工具的接受度每年都在降低,因为在每个新版本中它都变得越来越慢。
如果我可以禁用所有“高级”功能,我想使用它,但是正如你所提到的,你不能完全禁用索引器。如果JSP文件的验证器已经在运行,则无法停止它(如果您有像您一样的文件那么多,我们项目中也有大约1000个JSP文件和许多标记文件,则可以测试此功能)。
我还可以证明增加内存并没有帮助。它只能防止整个eclipse崩溃,但它并不能减少WTP内部操作的UI阻塞。
在最新版本的3.2.3中,当我从servers view中启动Tomcat时,我会遇到很多挂起。UI会挂起大约1分钟。不仅是我遇到了这个问题,我的所有在Windows上工作的同事都有同样的问题。在Linux上,我不知道这个问题。
此外,在没有互联网访问权限时,WTP也存在问题。似乎有请求向某些注册表下载模式或类似的东西,如果您没有连接,则它会挂起并等待超时。

1
关于互联网连接问题:Web标准工具和Java标准工具使用的模式应该在XML目录中,或者至少被缓存。至于其他方面,您应该能够在XML目录中添加条目,或者自己引用任何本地目录。在WTP 3.1.x中,完整的OASIS目录规范已经实现,在3.2.x中,首选项中的用户界面支持此功能。这允许完全离线工作,即使使用复杂的XML模式--我每天都使用它。(完全披露:我作为个人提交者参与了WTP) - JesperSM
当我运行测试套件时,遇到了缺失互联网连接的特殊问题。它在一个虚拟的Linux机器上运行,该机器仅连接到本地网络而非互联网。我使用org.eclipse.test框架中的插件测试套件来测试自己的插件。当我使用VNC客户端连接到测试的虚拟桌面时,我可以看到Eclipse启动并立即尝试加载Web服务DOM或类似内容。我不知道如何停止这个过程。 - Udo
这是哪个“测试套件”?让我来搞清楚:你是在运行WTP测试,还是在测试使用了WTP的WSDL组件的自己的bundle?看起来WTP的EntityResolver没有从XML目录中获取schema/WSDL:请注意它查找目标工作区的目录。如果在调试下运行并中断测试,并定位线程,您可以停止测试并找到等待连接的线程,应该可以找到原因。如果您发布一个pastebin参考或类似内容,我可以在eclipse.org上设置错误。 - JesperSM
我在网上搜索并找到了这个链接:http://old.nabble.com/WsDomStartupParticipant-td30290342.html - Udo
这正是我所经历的。在我的项目中,我没有使用网络服务,但我确实需要在启动过程中等待启动。关于“测试框架”的问题,我使用了这里的框架:http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.6.2-201102101200/eclipse-test-framework-3.6.2.zip。为了测试我的插件,我启动了一个完全配置好的Eclipse,其中包括JEE版本的Eclipse和我们的插件。我运行Junit插件测试。 - Udo

4
我看到了类似的效果,这里有一个解决方案可能适用于某些项目环境...
为了保证快速和负责任的Eclipse Web项目环境,请考虑以下内容:
1. 使用Java开发人员的Eclipse IDE - 98MB版本比200MB EE版本更精简 - 在“常规/启动和关闭”中,除“Eclipse UI”外禁用所有选项 - 在验证中,禁用您不需要的验证器 - 这些可能会防止一些性能问题(YMMW)
2. 使用Jetty - 您不需要WTP或任何其他插件,它是纯Java - 像Tomcat一样,但非常快速且简单,可安装到任何IDE/环境中 - 直接嵌入您的项目文件中,为每个开发人员配置一次 - 可在任何IDE中使用(Eclipse,IDEA,JDeveloper等) - 使用“Debug As” / “Run As”启动Servlet容器 - 通过单击Eclipse控制台上的红色框来关闭Servlet容器 - IDE控制台、调试和热代码替换以及JRebel都可以正常工作
结果:与许多使用带有WTP功能的Eclipse EE版本的其他Eclipse安装相比,快速且响应灵敏的Eclipse。
为什么?可能是某些Eclipse功能或插件包含错误或仅以不良方式使用资源,这使得Eclipse UI缓慢。
非Java EE Eclipse对于许多Java EE项目环境而言已经足够好了,这完全取决于您的架构和使用的工具。
以下是一个快速入门教程,如果您想尝试在Eclipse中使用Jetty Servlet容器,请参见https://vaadin.com/web/jani/home/-/blogs/vaadin-for-everyone-how-to-get-started。下载VaadinProjectForAnyIDE.zip,这是一个Eclipse项目。只需忽略Vaadin内容,用自己的servlet替换HelloWorldApplication.java,并相应地编辑web.xml。
还有一件事。使用Eclipse EE版本,您可能还希望尝试J2EE预览服务器,它实际上是嵌入到Eclipse捆绑包中的Jetty。但是,这也使用WTP机制。

4

我不知道是WTP还是JBoss Tools的问题。

事实是,当我使用GWT(最小化JSP)时,我采取了相反的方式:完全不使用WTP!我现在使用纯Java Eclipse,并使用运行配置来部署(通过编程调用ANT)和启动服务器,我再也没有回头看过!

Eclipse以前需要大约1.5GB的内存,并且经常崩溃。现在,它只占用了约800MB的内存,并且整个环境变得更加稳定。


2
我也认为Eclipse/WTP的稳定性和性能有些令人担忧。我自2003年中期开始使用Eclipse,也一直在尝试WTP自它最初发布以来的版本。
起初,质量非常糟糕,但对于一个0.x版本来说,我当然不能抱怨。在等待WTP成熟的同时,我使用了MyEclipse,它还算可以,但也有其缺陷(并且部分基于WTP,继承了一些WTP的问题)。
当MyEclipse变得越来越沉重、越来越慢,并且我们遇到了几个稳定性问题时,我们转向了“纯WTP”。我们真正使用的只是基本的JSP/JSF编辑器和部署工具。
由于WTP不支持增量部署(至少不适用于JBoss服务器运行时),我们添加了来自JBoss工具的单独服务器运行时。当我们采用Facelets时,我们也切换到了JBoss工具的编辑器。
然而,我们也遇到了许多与MyEclipse相同的问题。存在无法解释的减速现象,但更糟糕的是各种稳定性问题。存在许多尴尬的异常和崩溃。我检查过许多不同工作站上的.log文件,其中包含了最后10个异常的小选择:
java.lang.NullPointerException
        at org.eclipse.jst.jsp.core.internal.validation.JSPActionValidator.isElIgnored(JSPActionValidator.java:147)

2.
java.lang.RuntimeException
        at org.eclipse.jface.viewers.ColumnViewer.checkBusy(ColumnViewer.java:763)

3.
java.lang.ArrayIndexOutOfBoundsException: 38
        at org.eclipse.debug.internal.ui.viewers.model.FilterTransform$Node.addFilter(FilterTransform.java:67)

4.
org.eclipse.jdi.TimeoutException: Timeout occurred while waiting for packet 302111.
        at org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:171)

5.
java.lang.NullPointerException
        at org.eclipse.jst.jsf.facelet.core.internal.cm.ElementCMAdapter.getLength(ElementCMAdapter.java:109)

6.
Caused by: java.lang.NullPointerException
        at org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.WebappConfiguration.getConfigFilesFromContextParam(WebappConfiguration.java:184)

7.
org.eclipse.emf.ecore.resource.Resource$IOWrappedException: Feature 'span' not found. (file:///mysystem/Eclipse.app/Contents/MacOS/com
/sun/faces/metadata/taglib/facelets_jsf_core.taglib.xml, 453, 52)
        at org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl.handleErrors(XMLLoadImpl.java:83)
        ...
        at org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.TagModelLoader.loadFromInputStream(TagModelLoader.java:100)

8.
java.lang.NullPointerException: No IModelProvider exists for project P/my_project of version: Utility Module
            at org.eclipse.jst.j2ee.model.ModelProviderManager.getModelProvider(ModelProviderManager.java:101

9.
 java.lang.NullPointerException
            at org.eclipse.jst.j2ee.internal.deployables.J2EEDeployableFactory.clearCache(J2EEDeployableFactory.java:238)

10.
org.eclipse.jst.jee.model.internal.mergers.ModelException: java.util.ConcurrentModificationException
        at org.eclipse.jst.jee.model.internal.mergers.EjbJarMerger.process(EjbJarMerger.java:79)

请注意,这些仅是最后10个,还有很多其他的例外情况。一般的反应可能是:“你的Eclipse安装已经损坏了!你有一个本地问题!” 是的,我可能有一个本地问题,但是这个“本地问题”似乎很普遍,因为我检查过的许多Eclipse安装都在它们的日志中发现了这些问题。
我也遇到了像以下链接中所报道的各种不同版本的部署问题:http://community.jboss.org/thread/158611 这可能是JBoss工具特定的问题,也可能基于底层的WTP或者Eclipse代码。我不知道,但我知道这是一个恶心的问题。每个WTP和JBoss工具的版本都有“某些东西”被修复了,但每个版本都会出现类似的问题,只是形式稍有不同。
在稳定性问题之间,我能够完成一些工作,并且我喜欢编辑器提供给我的自动完成和导航功能(这使我不必切换到文本编辑器并完全从命令行构建),但我肯定希望增加一些稳定性。

你能否提交一个带有栈跟踪1剩余部分的错误报告?除非正在验证的模型被错误地初始化,否则该方法中不应该出现该异常。https://bugs.eclipse.org/bugs/enter_bug.cgi?product=WTP%20Source%20Editing&component=jst.jsp - nitind

1

我已经禁用了WTP JSP编辑器,原因如你所述:它需要太多的资源。还有一些你应该考虑的事情:

在普通的HTML编辑器中编辑JSP。这意味着您不会得到代码补全,这是一件好事。在我看来,在Java和HTML中混合使用是一种错误,编辑器无法解决这个问题。将所有Java代码放入帮助程序bean中(您可以轻松测试这些代码),然后只需从JSP访问这些bean。这应该摆脱99%的<% %>标签并解决大部分问题。
考虑使用Spring以便能够构建更复杂的bean,并使用以下模式将它们注入到您的JSP中:
1. How to inject spring beans into a jsp 2.0 SimpleTag? 2. 使用SpringBeanAutowiringSupport: ``` <%! @Autowired private Bean bean;
public void jspInit() { SpringBeanAutowiringSupport .processInjectionBasedOnServletContext( this, getServletContext() ); } %> ```
尝试一个不同的虚拟机。WTP编辑器创建大量对象,而现在所有的VM(GC实现)都可以同样好地处理它们。如果您使用Sun的Java,请尝试JRockitIBMs J9。还可以调整GC设置。增加RAM无济于事,因为如果您有GC问题,更多的RAM通常只会使情况变得更糟(因为GC将不得不处理更多数据)。
尽可能预编译代码。您不需要在工作区中始终打开4000个类。将庞大的项目划分为可管理的块。
将JSP替换为普通Java servlet,并使用HTML渲染库(如rendersnake)或使用与HTML更兼容的编程语言(如Groovy)。
购买一些像样的硬件。一台新的四核8GB RAM PC的成本为1000美元。如果您每天节省10分钟,投资将在50天内收回(以每个人总共花费1000美元/天的速度计算)。
尝试MyEclipse,它具有更好的Web编辑器。 JSP编辑器比WTP好(例如,代码补全大多数情况下都有效),但仍然很慢。

1

WTP(3.2.3)对我来说也很慢。我相信我已经找到了一些方法使它不那么慢:

  • 我们使用maven,因此有一个target目录,其中包含所有JSP的副本和一些其他XML文件。我已经意识到它们有时会被WTP验证器扫描。但这是不必要的,所以我已经将它们从验证中排除(项目/属性/验证/XXX/排除组/)。(当将target目录标记为派生时,您应该能够获得相同的效果,但有时对我不起作用;-()
  • 我做出了(未经科学证明)的观察,即WTP似乎比JSP文件更快与JSPX配合使用。

1
到目前为止,加速我的项目的最佳方法是预编译我当前未使用的代码。我们有大约20个项目组成我们的系统,当解决任何特定问题时,我只会接触其中一小部分Java文件。编译大部分我不会接触的代码并将其放入一些.jar文件中,然后使用它作为源代替包含这些项目已被证明可以显著加快速度。如果您有4k+文件,我想它也会对您有所帮助。 每个项目都有一个小的build.xml,可以将其制作成一个jar文件以包含在内。
至于JSP编辑的令人无聊的缓慢。我也有同样的问题,它就是太慢了。我没有多于100个jsp文件,但我和你一样遇到了同样的问题。我的解决方案只是向硬件投入资金,我必须承认我喜欢这样做:P。

你能量化“令人昏昏欲睡的缓慢”吗?你在哪里看到了迟缓? - nitind

1
回答以下问题: 你有一些最佳实践来加速它,特别是对于像我们这样的中上规模的公司吗?
关闭文件保存后的验证和自动构建是提高性能的好方法。

1
如果你需要基本的Java EE,那么使用Netbeans会更好;如果你需要一切都能正常工作,那么使用IDEA会更好。就是这么简单。

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