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 插件进行开发

在 Grails 控制器中对父子元素进行排序

在 Grails 中对域实例进行版本控制以供批准

从 Grails 应用程序外部插入数据时,Grails 如何设置 _idx 字段?

将 Grails 与现有的 Web 应用程序集成