Eclipse中对Grails web应用程序的调试支持较差

Eclipse中对Grails web应用程序的调试支持较差,eclipse,groovy,grails,Eclipse,Groovy,Grails,我是一个日常的C#/ASP.NET MVC/visualstudio用户,我刚刚在JAVA/GRails/Eclipse中启动了一个项目,但是我发现使用Eclipse的调试功能非常困难,并且发现它们与visualstudio相比有些有限。特别是,我发现以下内容相当令人失望,但我不知道它们是Eclipse作为普通IDE的局限性,还是我正试图使用它进行Grails开发的事实 与VisualStudio的“即时窗口””相比,它似乎很差劲——在VS中,我在调试期间一直使用即时窗口,我发现在eclipse

我是一个日常的C#/ASP.NET MVC/visualstudio用户,我刚刚在JAVA/GRails/Eclipse中启动了一个项目,但是我发现使用Eclipse的调试功能非常困难,并且发现它们与visualstudio相比有些有限。特别是,我发现以下内容相当令人失望,但我不知道它们是Eclipse作为普通IDE的局限性,还是我正试图使用它进行Grails开发的事实

  • 与VisualStudio的“即时窗口””相比,它似乎很差劲——在VS中,我在调试期间一直使用即时窗口,我发现在eclipse中,它的等价物是“显示”视图。然而,在VS中,我可以键入对象的名称(例如“?user”),在按下enter键时,我会得到该对象的所有属性/方法,而在eclipse中,我必须突出显示表达式,然后显式告诉它检查、执行等,然后,它将检查结果添加到另一个窗口,迫使我介于两者之间

  • 显示视图似乎无法实际评估属性或方法。例如,如果我有一个用户类的实例,并且在显示窗口中键入userInstance.FirstName或调用userInstance.FullName()等方法,则会出现计算失败错误:“类型对象的方法FullName()未定义”。此外,如果我为实例添加一个watch,我可以看到属性,但同样地,该方法也不存在。但是,该方法作为代码块中的表达式进行计算(证明它确实存在并被识别)

  • 此外,尽管各种文档都说明可以通过简单地高亮显示对象来添加手表,但右键单击并添加手表此选项似乎不存在,因此我必须在显示视图中键入对象,高亮显示它并从显示视图上下文菜单添加手表

  • 对User.get(params.id)等表达式求值(同样在显示视图中)会返回错误,例如:

  • User.get(参数id)
    评估失败。 原因:无法解析参数

    但是,在遍历代码时,它的计算结果很好。这是因为Grails/Groovy的动态特性吗

    代码片段:

    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;
        }
    }
    
    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]
            }
        }
    
    ...
    
    }
    
    UserController.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;
        }
    }
    
    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


    首先,SpringSource工具套件在使用Grails和Groovy时有了很大的改进。所以我建议你试试。但是,您仍然会遇到相同的问题

    对于第1点,我也错过了即时窗口

    点2-4不起作用的原因是因为Groovy的动态特性,Eclipse只知道如何处理普通Java对象,而当它们是Java对象时,Groovy会添加到对象中,例如Eclipse不知道的动态方法


    我不能谈论Idea的Netbeans,但您可能想看看它们。

    大约6个月前,我评估了Groovy/Grails开发的所有3个主要Java IDE,IntelliJ Idea远远领先于其他两个。我不知道从那以后他们是否有所改进,但我今天仍然在使用IntelliJ,我对此非常满意。它对调试Groovy的支持非常好,允许您完成上面描述的所有事情。我知道它不是免费的,但在我看来,它值每一分钱。

    一旦您获得了使用该平台的一些经验,就可以适应任何非IDE编辑器(我喜欢Far Manager附带的编辑器)了

    就我个人而言,我没有使用这两个IDE来创建最新的项目,而且它比我从事的任何其他项目都要快得多


    有趣的是,因为我没有IDE来告诉我我拼错了一些东西,所以我创建了很多单元测试(你无论如何都应该这么做),我使用自动测试插件来做测试。这是一件非常有趣的事情,当我打字的时候,我没有什么可以阻止我的——只是纯粹的创作:)

    请注意,从STS2.5.1开始,当Groovy停止在Groovy堆栈框架上时,Groovy有扩展的调试支持。现在,display视图和expressions视图可以识别Groovy语法,并可以按照您期望的方式计算Groovy代码


    因此,这意味着您的第2点和第4点现在正在发挥作用。

    嗨,斯科特,谢谢您的评论。你基本上证实了我所担心的情况。我可以理解对象的动态属性/方法的这些限制,但我似乎无法理解为什么我在对象中定义的属性/方法也是如此。如第2点所述,即使对于在设计类型定义的方法(例如FullName()方法),调试器似乎也不知道它们(方法FullName()未定义)。您或任何人知道为什么会这样吗?这仅仅是因为它是groovy类,所以eclipse根本不理解它吗?