【问题标题】:Grails 2.3.1 on Mac ; ClassNotFound NoUniqueBeanDefinitionExceptionMac 上的 Grails 2.3.1 ; ClassNotFound NoUniqueBeanDefinitionException
【发布时间】:2013-11-21 16:05:52
【问题描述】:

最近,我将一个 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.1gvm flush archivesgvm 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.jar。
  • 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 scan 来搜索重复的类。没有找到。

再次,我很确定系统实际上并没有尝试抛出 NoUniqueBeanDefinitionException。我认为它只是试图找到那个类并且由于某种原因不能。

----------------------------------------------
Scanned archives: 2 
Errors: 0
Archives with hits: 0

【问题讨论】:

    标签: macos spring grails


    【解决方案1】:

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

    es:

    Controllers/MyGreatController.groovy
    Controllers/MygreatController.groovy
    

    如果失败,请查看 grails 依赖报告的输出。确保您的项目引入的 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

    【讨论】:

    • 我有理由确定这不是问题所在。否则,为什么在全新克隆后,某些项目代码会在其他工作站上正常运行?此外,例外不是有一个非唯一的 Bean。例外是Java 甚至无法find org.springframework.beans.factory.NoUniqueBeanDefinitionException 类。也就是说,它是 ClassNotFoundException,而不是 NoUniqueBeanDefinitionException。
    • 尝试打包应用程序,解压缩war并运行JarScan(java.net/projects/jarscan)以搜索重复的Class Defs。
    • 嗯...有趣。所以,如果我尝试 grails dev war,我会收到这个错误:WAR packaging error: Warning: Could not find file /Users/username/grails_projects/finance/cluster_resources/ehcache_distributed.xml to copy.
    • 另外,我确实尝试在我的目标文件中查找重复的类。查看帖子底部的最新编辑。
    • 请运行命令 >grails refresh-dependencies myApplicationDependencies.xml 并发布结果文件
    【解决方案2】:

    我有一个依赖项(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查看禁用传递依赖解析下的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-17
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多