Eclipse 中对 Grails Web 应用程序的调试支持不佳
Posted
技术标签:
【中文标题】Eclipse 中对 Grails Web 应用程序的调试支持不佳【英文标题】:Poor debugging support for Grails web app in Eclipse 【发布时间】:2011-01-16 13:09:50 【问题描述】:我是一个日常的 C#/ASP.NET MVC/Visual Studio 用户,我刚刚在 JAVA/GRails/Eclipse 中开始了一个项目,但我是发现使用 Eclipse 的调试功能非常困难,并且发现它们与 Visual Studio 相比有些受限。特别是,我发现以下内容相当令人失望,但我不知道它们是否是 Eclipse 作为香草 IDE 的限制,或者我正试图将其用于使用 Grails 进行开发的事实。
看起来相当于 Visual Studio 的“即时窗口”——在 VS 中,我在调试期间一直使用即时窗口,我发现在 Eclipse 中相当于“展示”视图。然而,在 VS 中,我可以输入对象的名称(例如“?user”),然后按回车键,我会得到该对象的所有属性/方法,而在 Eclipse 中,我必须突出显示表达式,然后明确告诉它检查、执行等。完成后,它会将检查结果添加到另一个窗口,迫使我在两者之间切换。
显示视图似乎无法实际评估属性或方法。例如,如果我有一个用户类的实例,并且在显示窗口中键入 userInstance.FirstName 或调用诸如 userInstance.FullName() 之类的方法,我会收到评估失败错误:“方法 FullName() 未定义类型对象”。此外,如果我为实例添加手表,我可以看到属性,但同样看不到该方法。但是,该方法作为代码块中的表达式计算得很好(证明它确实存在并且被识别)
1234563查看,突出显示它并从显示视图上下文菜单中添加一个手表。评估诸如 User.get(params.id) 之类的表达式(再次在显示视图中)返回错误,如下所示:
User.get(params.id) 评估失败。 原因:无法解析参数
但是,它在单步执行代码时评估良好。这是因为 Grails/Groovy 的动态特性吗?
代码sn-ps:
User.groovy:
class User
String firstName
String lastName
String middleName
private String fullname
static constraints =
firstName(blank:false)
lastName(blank:false)
middleName(blank:false)
public String FullName()
fullname = firstName + " " + lastName;
UserController.groovy:
class UserController
...
def show =
User userInstance = User.get(params.id)
userInstance.FullName()
if (!userInstance)
flash.message = "$message(code: 'default.not.found.message', args: [message(code: 'user.label', default: 'User'), params.id])"
redirect(action: "list")
else
[userInstance: userInstance]
...
谁能说出这些是否是 Eclipse、Eclipse 的 Grails 插件或其他可能的限制。无论如何,他们使用 JAVA 开发 MVC Web 应用程序的吸引力远不如我使用的等效 ASP.NET MVC。
谢谢
【问题讨论】:
【参考方案1】:大约 6 个月前,我评估了用于 Groovy/Grails 开发的所有 3 个主要 Java IDE,而 IntelliJ IDEA 远远领先于其他两个。我不知道从那以后它们是否有所改进,但我今天仍在使用 IntelliJ 并且对此感到非常满意。它对调试 Groovy 的支持非常好,并且允许您执行上述所有操作。我知道它不是免费的,但在我看来,每一分钱都值得。
【讨论】:
【参考方案2】:首先,在使用 Grails 和 Groovy 时,SpringSource Tool Suite 得到了很大改进。所以我建议你试试。但是,您仍然会遇到同样的问题。
对于第 1 点,我也错过了即时窗口。
第 2-4 点不起作用的原因是因为 Groovy 的动态特性,Eclipse 只知道如何使用普通 Java 对象,而当它们是 Java 对象时,Groovy 添加到对象中,例如动态方法Eclipse 不知道。
我不能谈论 Netbeans of Idea,但你可能想看看它们。
【讨论】:
嗨,斯科特,感谢您的 cmets。你基本上证实了我担心的情况。我可以理解对象的动态属性/方法的这些限制,但我似乎无法理解为什么我在对象中定义的属性/方法也是如此。如第 2 点所述,即使对于在设计类型中定义的方法(例如 FullName() 方法),调试器似乎也不知道它们(方法 FullName() 未定义)您或任何人都知道为什么会这样吗?只是因为它是一个 groovy 类,所以 eclipse 根本不理解它吗?【参考方案3】:请注意,从 STS 2.5.1 开始,当在 Groovy 堆栈帧上停止时,对 Groovy 的调试支持得到扩展。现在,显示视图和表达式视图可以识别 Groovy 语法,并可以按照您期望的方式评估 Groovy 代码。
因此,这意味着您的第 2 点和第 4 点现在正在发挥作用。
【讨论】:
【参考方案4】:一旦您获得了使用该平台的一些经验,习惯任何非 IDE 编辑器(我喜欢 Far Manager 附带的编辑器)就是小菜一碟。
就我个人而言,我没有使用这两种 IDE 来创建最新的项目,而且它比我从事的任何其他项目都快得多。
有趣的是,因为我没有 IDE 来告诉我我拼错了一些东西,所以我创建了很多单元测试(无论如何你都应该这样做)并且我正在使用自动测试插件进行测试.这样很有趣,我打字的时候没有什么可以阻止我的——只是纯粹的创作:)
【讨论】:
以上是关于Eclipse 中对 Grails Web 应用程序的调试支持不佳的主要内容,如果未能解决你的问题,请参考以下文章
Grails 3.1.4 和 Docker - grails 命令返回“No profile found for name web”
在 Grails 中使用 Groovy-Eclipse 插件进行开发