在IntelliJ IDEA运行Grails 2.5.0应用遇加载器约束冲突报错
Grails 2.5.0应用运行报错排查思路请求
在IntelliJ IDEA中运行一款同事机器可正常运行的遗留Grails 2.5.0应用时,出现编译致命错误:
Fatal error during compilation org.apache.tools.ant.BuildException: java.lang.LinkageError: loader constraint violation: when resolving method "org.springsource.loaded.TypeRegistry.getReloadableType(II)Lorg/springsource/loaded/ReloadableType;" the class loader (instance of groovy/lang/GroovyClassLoader) of the current class, grails/plugin/cache/compiler/CacheTransformation, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for the method's defining class, org/springsource/loaded/TypeRegistry, have different Class objects for the type org/springsource/loaded/ReloadableType used in the signature
已知该错误源于两个不同类加载器尝试加载springloaded库的ReloadableType类。
而在命令行运行时则触发另一个错误:
java.lang.NullPointerException at _PluginDependencies$_run_closure2.doCall(_PluginDependencies.groovy:48) at org.codehaus.gant.GantMetaClass.invokeMethod(GantMetaClass.java:133) at org.codehaus.gant.GantBinding$_initializeGantBinding_closure5_closure16_closure18.doCall(GantBinding.groovy:185) at org.codehaus.gant.GantBinding$_initializeGantBinding_closure5_closure16_closure18.doCall(GantBinding.groovy) at org.codehaus.gant.GantBinding.withTargetEvent(GantBinding.groovy:90) at org.codehaus.gant.GantBinding.this$4$withTargetEvent(GantBinding.groovy) at org.codehaus.gant.GantBinding$_initializeGantBinding_closure5_closure16.doCall(GantBinding.groovy:185) at org.codehaus.gant.GantBinding$_initializeGantBinding_closure5_closure16.doCall(GantBinding.groovy) at org.codehaus.gant.GantMetaClass.invokeMethod(GantMetaClass.java:133) at _GrailsPackage$_run_closure2.doCall(_GrailsPackage.groovy:57) at org.codehaus.gant.GantMetaClass.invokeMethod(GantMetaClass.java:133) at org.codehaus.gant.GantBinding$_initializeGantBinding_closure5_closure16_closure18.doCall(GantBinding.groovy:185) at org.codehaus.gant.GantBinding$_initializeGantBinding_closure5_closure16_closure18.doCall(GantBinding.groovy) at org.codehaus.gant.GantBinding.withTargetEvent(GantBinding.groovy:90) at org.codehaus.gant.GantBinding.this$4$withTargetEvent(GantBinding.groovy) at org.codehaus.gant.GantBinding$_initializeGantBinding_closure5_closure16.doCall(GantBinding.groovy:185) at org.codehaus.gant.GantBinding$_initializeGantBinding_closure5_closure16.doCall(GantBinding.groovy) at org.codehaus.gant.GantMetaClass.processClosure(GantMetaClass.java:81) at org.codehaus.gant.GantMetaClass.processArgument(GantMetaClass.java:95) at org.codehaus.gant.GantMetaClass.invokeMethod(GantMetaClass.java:128) at RunApp$_run_closure1.doCall(RunApp.groovy:28) at org.codehaus.gant.GantMetaClass.invokeMethod(GantMetaClass.java:133) at org.codehaus.gant.GantBinding$_initializeGantBinding_closure5_closure16_closure18.doCall(GantBinding.groovy:185) at org.codehaus.gant.GantBinding$_initializeGantBinding_closure5_closure16_closure18.doCall(GantBinding.groovy) at org.codehaus.gant.GantBinding.withTargetEvent(GantBinding.groovy:90) at org.codehaus.gant.GantBinding.this$4$withTargetEvent(GantBinding.groovy) at org.codehaus.gant.GantBinding$_initializeGantBinding_closure5_closure16.doCall(GantBinding.groovy:185) at org.codehaus.gant.GantBinding$_initializeGantBinding_closure5_closure16.doCall(GantBinding.groovy) at gant.Gant$_dispatch_closure5.doCall(Gant.groovy:381) at gant.Gant$_dispatch_closure7.doCall(Gant.groovy:415) at gant.Gant$_dispatch_closure7.doCall(Gant.groovy) at gant.Gant.withBuildListeners(Gant.groovy:427) at gant.Gant.this$2$withBuildListeners(Gant.groovy) at gant.Gant.dispatch(Gant.groovy:415) at gant.Gant.this$2$dispatch(Gant.groovy) at gant.Gant.invokeMethod(Gant.groovy) at gant.Gant.executeTargets(Gant.groovy:591) at gant.Gant.executeTargets(Gant.groovy:590) | Error Error loading plugin manager: null
已生成依赖报告排查首个错误,但未发现异常,恳请提供解决思路。
解决思路
针对IDEA中的类加载冲突错误
- 强制springloaded依赖仅由系统类加载器加载:在IDEA的Run Configuration中,添加VM参数
-Dspringloaded.shared=true,确保该类库只被顶层类加载器加载,避免GroovyClassLoader重复加载。 - 清理IDEA缓存并重新导入项目:执行
File > Invalidate Caches...,勾选所有选项后重启IDEA;随后删除.idea目录和build文件夹,重新导入项目。 - 统一依赖版本:检查
BuildConfig.groovy中springloaded的版本,确保与同事环境完全一致;若依赖通过插件间接引入,可显式指定版本号,避免依赖冲突。 - 禁用IDEA的Build and Run Actions:在
Settings > Build, Execution, Deployment > Build Tools > Grails中,将Build and Run actions切换为使用Grails命令而非IDEA内置工具,减少类加载器差异。
针对命令行的PluginDependencies空指针错误
- 检查本地Grails环境版本:确认本地安装的Grails版本为2.5.0,与项目要求一致;可通过
grails -version验证,若版本不符则切换对应版本。 - 清理本地Grails缓存:删除
~/.grails/2.5.0目录下的缓存文件,重新下载插件和依赖;执行grails clean和grails compile命令重建项目。 - 检查
BuildConfig.groovy配置:确认插件仓库地址、依赖声明无语法错误,特别是plugins块中的配置,避免因配置缺失导致插件管理器初始化失败。 - 复制同事的本地依赖缓存:若上述操作无效,可直接复制同事机器上
~/.grails/2.5.0目录下的plugins和repository文件夹,确保依赖和插件完全一致。
内容的提问来源于stack exchange,提问作者Jim Gough
相关产品推荐
相关产品推荐

