如何将 Grails 2.1 迁移到 Grails 2.3 应用程序?
Posted
技术标签:
【中文标题】如何将 Grails 2.1 迁移到 Grails 2.3 应用程序?【英文标题】:How to migrate Grails 2.1 to Grails 2.3 application? 【发布时间】:2013-05-24 15:54:26 【问题描述】:我正在将我的应用程序从 Grails 2.1 迁移到 2.3。迁移后我遇到了很多错误 - 我想要一些带有 Grails 2.3 和 Spring 集成的示例应用程序。
我做了一些 HelloWorld 示例应用程序,它们运行良好。但即使我在我的应用程序中应用了同样的东西,甚至在一些地方它给出了错误。因为我的应用程序非常大(100mb),而且我使用了大量与 Spring、Hibernate 和许多 Grails 插件的集成。
我没有找到任何类似“从 Grails 2.1 迁移到 Grails 2.3”的代码级文档。我无法从 Grails 或在线找到任何示例应用程序。
Grails 官方文档,所有关于提供 Grails META 信息的内容。
在我的 main.gsp 229 行中:
<g:include controller="filter" action="tree"/>
Caused by: org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException: Error processing GroovyPageView: Error executing tag <g:include>: Unable to execute include: Request processing failed; nested exception is org.codehaus.groovy.grails.exceptions.GrailsRuntimeException: java.lang.IllegalStateException: Cannot reset buffer after response has been committed
at org.codehaus.groovy.grails.web.servlet.view.GroovyPageView.createGroovyPageException(GroovyPageView.java:205)
at org.codehaus.groovy.grails.web.servlet.view.GroovyPageView.handleException(GroovyPageView.java:182)
at org.codehaus.groovy.grails.web.servlet.view.GroovyPageView.renderWithTemplateEngine(GroovyPageView.java:153)
at org.codehaus.groovy.grails.web.servlet.view.GroovyPageView.renderMergedOutputModel(GroovyPageView.java:84)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:264)
at org.codehaus.groovy.grails.web.sitemesh.SpringMVCViewDecorator.render(SpringMVCViewDecorator.java:67)
... 51 more
Caused by: org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException: Error executing tag <g:include>: Unable to execute include: Request processing failed; nested exception is org.codehaus.groovy.grails.exceptions.GrailsRuntimeException: java.lang.IllegalStateException: Cannot reset buffer after response has been committed
at org.codehaus.groovy.grails.web.pages.GroovyPage.throwRootCause(GroovyPage.java:531)
at org.codehaus.groovy.grails.web.pages.GroovyPage.invokeTag(GroovyPage.java:475)
at sun.reflect.GeneratedMethodAccessor379.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1243)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1085)
at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1110)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:989)
at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1110)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66)
at mycompany_dev_testuserdev_ws3_myapp_grails_app_views_layouts_main_gsp$_run_closure2.doCall(main.gsp:229)
【问题讨论】:
提供错误详情 【参考方案1】:将您的 Config.groovy 和 BuildConfig.groovy 文件与空的新 Grails 2.3 应用程序的默认值进行比较。
最显着的变化是插件依赖项不应再在 application.properties 中描述。您还应该确保使用正确版本的 Grails Tomcat、Hibernate 和 Scaffolding 插件。 Tomcat & Hibernate 插件版本不再与 Grails 发布版本相同。在 Grails 2.3 中,脚手架功能已被提取到单独的插件中。 还要确保为插件使用正确的范围(为 tomcat 构建,为 hibernate 构建运行时)。
还建议开始使用新的基于 maven(使用作为 maven 一部分的 aether 库)的依赖解析。这是通过 BuildConfig.groovy 中的 grails.project.dependency.resolver = "maven"
设置完成的。我在 Grails 2.3 中使用基于 ivy 的旧解析器遇到了奇怪的类加载问题。
我希望这会有所帮助。
【讨论】:
我从 main.gsp 中删除了“include”语句。在我收到类似这样的其他错误之后: 我在Getting a 'No thread-bound request found' error from spring in my web app 中发现了一些类似的问题。但它不在 Grails 的上下文中。我尝试过这种方式,但它给出了一些其他错误,例如:ClassCastException: org.springframework.web.context.request.ServletRequestAttributes cannot be cast to org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest
某些插件可能会引入旧版本的 Spring。我对 rabbitmq 插件有这个问题。请检查war文件的依赖报告和WEB-INF/lib。【参考方案2】:
迁移 Grails 2.3 非常简单——(我的情况是,我在 Grails 2.1.4 中使用 ivy、pom)
-
做一个示例项目并运行 - 确认它工作正常。留作参考。
在您的项目中,将所有 jar 和插件从 pom 移动到 BuildConfig,没有新的格式,就像您已经知道的一样。 (注意:不要错过任何一个 jar 或插件,这需要几天才能意识到,我犯了同样的错误需要 1 天半。)
并且,将 jar 和插件配置从 SampleProject -> BuildConfig 复制到您的项目 BuildConfig,如果您的应用中也有相同的 jar,请检查并删除旧版本并保留最新版本。
在 BuildConfig 中复制后
forkConfig = [maxMemory: 1024, minMemory: 64, debug: false, maxPerm: 256] grails.project.fork = [ test: forkConfig, // configure settings for the test-app JVM run: forkConfig, // configure settings for the run-app JVM war: forkConfig, // configure settings for the run-war JVM console: forkConfig // configure settings for the Swing console JVM ] grails.project.dependency.resolver = "maven" // or ivy grails.project.dependency.resolution =
-
运行
Grails upgrade
运行Grails run-app
【讨论】:
以上是关于如何将 Grails 2.1 迁移到 Grails 2.3 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章