最近,我将一个 Grails 项目从 2.0.1 升级到了 2.3.1。该项目在我的 Window 机器和我同事的 Mac(通过 Git 提取)上运行良好。但是,在我的 Mac 上,当我在完成安装插件和编译后尝试运行应用程序时出现此错误:
ClassNotFoundException: org.springframework.beans.factory.NoUniqueBeanDefinitionException
完整的堆栈跟踪位于http://pastebin.com/iEvKBmG5,但这是错误的症结所在。
如果我在交互模式下运行 grails,服务器会启动,但是当我浏览到控制器时,我只会得到一个白页。
我的 Mac 上的环境与导致此错误的同事的环境有什么不同?这是我为解决此问题而尝试的方法:
- 删除我的 ~/.grails 文件夹的内容(以及清除特定子文件夹的不太极端的变体)
- 删除项目并将其从 git 中拉回
grails clean
- 重新安装 grails 2.3.1(使用 gvm,所以我运行的命令是
gvm uninstall grails 2.3.1
,gvm flush archives
,gvm install grails 2.3.1
) - 将项目内容克隆到不同的目录
- 检查我的依赖报告,确保拉取的 spring 的版本大于 3.2.1,其中添加了 NoUniqueBeanDefinitionException 类。有关完整报告,请参阅http://pastebin.com/0AVC0SA0。
- 验证 NoUniqueBeanDefinitionException.class 文件是否在 spring-beans jar 中,位于 ~/.gvm/grails/2.3.1/lib/org.springframework/spring-beans/jars/spring-beans-3.2.4.RELEASE。罐。
grails refresh-dependencies myApplicationDependencies.xml
生成的文件位于http://pastebin.com/5bG9Vv78。- 从我的 maven 存储库中手动删除了 spring-beans 和其他 spring jar 的 3.1.2 版本,因为它们已在依赖项中列出。Maven只是重新解决它。
- 将依赖解析器切换到 ivy 并获取依赖报告。Spring 的 3.1.2 版本被列为“驱逐”。
我和我的同事都在运行 Mac OS X Mavericks 和最新版本的 Java。欢迎任何想法。
更新
我还仔细检查以确保我的项目不包含重复的类。为此,我运行grails dev war
并使用带有 -double 标志的jar 扫描来搜索重复的类。没有找到。
同样,我很确定系统实际上并没有试图抛出NoUniqueBeanDefinitionException。我认为它只是试图找到那个类并且由于某种原因不能。
----------------------------------------------
Scanned archives: 2
Errors: 0
Archives with hits: 0