1

最近,我将一个 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
4

2 回答 2

1

可能是某些文件名大写/小写的问题。检查所有源文件名是正确的名称(驼峰式),并且不存在同名但不同大小写的文件

埃斯:

Controllers/MyGreatController.groovy
Controllers/MygreatController.groovy

如果做不到这一点,请查看 grails dependency-report 的输出。确保您的项目引入的 Spring 版本高于或等于 3.2.1,因为这是添加了 NoUniqueBeanDefinitionException 类的 Spring 版本。该类位于 spring-beans 模块中。另外,请确保您的其他依赖项都没有引入旧版本的 spring-beans。

如果是,您可以使用 BuildConfig.groovy 中的 excludes 配置选项告诉 Grails 忽略该传递依赖项。例如,假设您正在从 mavenRepo“ https://maven.alfresco.com/nexus/content/groups/public/ ”中提取 activiti-engine jar。更改依赖声明以排除spring-beans,你应该是正确的。

compile("org.activiti:activiti-engine:5.13") {
    excludes "spring-beans"
}

请参阅http://grails.org/doc/2.3.1/guide/conf.html#dependencyResolution

于 2013-11-07T20:28:38.143 回答
0

我有一个依赖项(activiti 5.13),其中包含旧版本的 spring-beans 模块作为它自己的依赖项。出于某种原因,该版本在我的 Mac 上胜出,但在其他工作站上却被较新的 spring jar 压倒了。解决方法是在我的 BuildConfig.groovy 文件中从该依赖项中排除 spring-beans。

...
dependencies {
    // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes eg.
    compile("org.activiti:activiti-engine:5.13") {
        excludes "spring-beans"
    }
    // runtime 'mysql:mysql-connector-java:5.1.16'
}

这会阻止 Grails 传递地解决我的依赖项的特定依赖项。

请参阅http://grails.org/doc/2.3.1/guide/conf.html#configurationsAndDependencies中禁用传递依赖解析下的信息。

于 2013-11-13T18:11:36.323 回答