【问题标题】:Grails 2.1.0 Not Auto-Reloading / Auto-RecompilingGrails 2.1.0 不自动重新加载/自动重新编译
【发布时间】:2012-08-24 21:39:25
【问题描述】:

似乎 Grails 确实会自动重新编译我的 GSP 页面,但不会自动重新编译我的控制器。它曾经与以前版本的 Grails 一起工作。知道我可以寻找什么吗?

在 OSX Snow Leopard 上使用 Grails 2.1.0。

注意:这类似于this issue

【问题讨论】:

  • 所以你使用grails rA?尝试启动 grails 并运行 run-app
  • 你使用的是哪个jvm?根据文档 - Grails 2.1 重新加载机制不再使用类加载器,而是使用 JVM 代理重新加载对类文件的更改。
  • @chrislovecnm java version "1.6.0_33" Java(TM) SE Runtime Environment (build 1.6.0_33-b03-424-10M3720) Java HotSpot(TM) 64-Bit Server VM (build 20.8- b03-424,混合模式)
  • @MarkvanWyk 你试过 1.7 吗?
  • Grails 在 JDK 1.7 和 Grails 2.1.1 上运行 - 同样的事情开始发生......

标签: java grails


【解决方案1】:

免责声明:自动重新加载在我的 Mac 上一直有效。

我发现了一些可能有用的东西。

首先,运行自定义环境(非开发环境)似乎会禁用自动重新加载 (see this stackoverflow post),因此如果您以这种方式运行应用程序,则需要按照该帖子中的说明进行操作.

其次,如果您将应用程序作为战争运行,请确保自动重新加载已关闭。 (See the Grails Auto-Reload Page)

第三,我发现使用 Grails IDE(例如 IntelliJ 或 SpringSource)确实为 Grails 开发环境增加了很多稳定性。例如,IntelliJ 不使用二进制下载附带的 Grails shell 文件。它手动调用 Grails jar 和引导程序。

我的问题是:

您的其他环境是什么样的?您如何运行您的应用程序(run-app 或其他容器)?

你安装了哪些 Grails 插件(Grails 文档说 tomcat 插件配置为优化自动重新加载)?

您的计算机上是否下载了任何其他 Grails 二进制文件(在尝试加载时可能会导致混淆)?

最后,您能否在干净的环境中重现此问题(即新的 Grails 二进制文件、新的 Grails 创建应用程序)?

我还建议阅读 Grails 文档 (found here) 的部署部分。它有一些关于重新加载的相关信息。

对于冗长且可能没有回答的答案,我深表歉意,但我希望这引发了一两个想法。让我知道结果如何!

【讨论】:

  • 嗨@Jonathan,非常感谢您的回答。说实话,我不知道是什么让它停止重新加载然后重新开始。似乎过了一会儿它停止了,然后如果我重新启动我的机器,它又开始工作了——这使得调试变得更加困难。我正在使用 JDK 7(RunnApp / Dev Mode)在 Max OS X Mountain Lion 上运行 Grails 2.1.1 命令行。感谢所有的提示!欢迎来到 StackOverflow!有了这样的答案,您将立即获得数千分!
  • @Mark,非常感谢您的赞美。我希望在未来的岁月里成为人们有价值的参考。除了 JDK 之外,我的设置与您非常相似(遗憾的是,我正在运行 Mac 的默认 1.6)。但是,我一直在使用 IDE 来运行我的 Grails 开发环境。我今天一整天都在尝试你的确切设置,看看我是否遇到了同样的问题。我会及时通知你!
  • @Mark,所以我在这周的最后一部分时间都在使用你的设置,不幸的是,我无法重现你的情况。但是,我确实注意到一些插件对我的资源的重新加载有影响。我知道这与控制器重新加载无关,但只是想我会把它扔在那里。祝您找到答案好运!
【解决方案2】:

如果您在控制器上错误地命名包名称(如文件夹结构与包声明不一致),应用程序仍将运行并且不会报告错误,但自动重新加载将不起作用。

【讨论】:

  • 所以请仔细检查你的包名——尤其是在refectoring之后!
  • 你有什么可以和什么不工作的例子吗?我遇到了同样的问题,但似乎命名正确。
  • 另外,您必须将“grails run-app”作为单个命令而不是 grails 运行,然后在 grails 提示符下运行应用程序。
  • “grails run-app”与“grails”、“run-app”的区别让我很头疼,感谢您的澄清。此外,我正在使用 -D 参数运行,因此 GRAILS-8951 似乎相关。
【解决方案3】:

当我有一个派生其他控制器的 BaseController 类时,我遇到了这个问题。如果我对 BaseController 类进行更改,例如添加方法或闭包、更改方法名称、导入一些类等,Grails 中的整个类重新加载功能将停止运行。

对我有用的唯一解决方案是删除编译所有类的目标目录。至少这样我就不必每次都重新启动服务器,这使我不必等待大约 30 秒来显示起始页面。当类重新加载功能无法按预期工作时,这可能会很烦人。

Grails 自动重新加载功能并非没有怪癖。其中一些怪癖最终与 java 以及类加载在 servlet 容器环境中的工作方式有关。我希望 Grails 团队将优先考虑为 Grails 提供无缝类重新加载,就像其他脚本环境(ruby、PHP、python 或 play 框架)一样,因为处理这个框架的其他一些方面非常愉快。

【讨论】:

    【解决方案4】:

    奇怪,我从来没有遇到过这个问题。你确定你的控制器编译正确,没有错别字吗?我发现通常只需要一两秒钟就能看到控制器中反映的变化。域对象更改需要重新启动(它们通常会擦除您保存的数据),并且我发现有时对 Spring 托管资源(如注入服务)的更改不会“采取”。但是控制器和 GSP 页面在 97% 的时间内重新编译 :)

    我在 GGTS (eclipse) 和命令行运行应用程序之间切换,它几乎总是对我有用。您是否正在做任何类型的缓存?我在 Lion 上运行 JDK 1.6,grails 2.1.1

    通常你会看到输出告诉你一个文件已经在点击保存后的一两秒内重新编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-22
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      相关资源
      最近更新 更多