避免 grails 中的循环引用继承

Posted

技术标签:

【中文标题】避免 grails 中的循环引用继承【英文标题】:Avoid cyclic reference inheritance in grails 【发布时间】:2014-07-18 15:16:36 【问题描述】:

我有一个用 Grails 2.3.8 编写的大项目。有时,当我使用 CI 部署它时,我会收到以下消息:

由于 ***Error,无法完成对 Web 应用程序 [/ProjectName##1152] 注释的扫描。

可能的根本原因包括 -Xss 设置过低和非法循环继承依赖项。 正在处理的类层次结构是 [org.bouncycastle.asn1.ASN1EncodableVector->org.bouncycastle.asn1.DEREncodableVector->org.bouncycastle.asn1.ASN1EncodableVector]

我已经增加了Xss设置,但很清楚,但也许我错了,有一个循环引用: org.bouncycastle.asn1.ASN1EncodableVector->org.bouncycastle.asn1.DEREncodableVector->org.bouncycastle.asn1.ASN1EncodableVector

我表示您可以避免检查,我无法删除该库,因为我需要它。但我不知道如何在 Grails 中做到这一点。我可以排除它们,但这不是我想要的。

非常感谢您的建议

尼贝

更新 我刚刚解决了这个问题。我在 buildConfig 文件中删除了 bouncycastle 库的所有痕迹。没有任何依赖或排除的痕迹。只需在 crypto.2.0 中添加插件,一切正常!

【问题讨论】:

关于 SO 的另一篇文章在这里提到了同样的问题:***.com/questions/17584495/…。我认为您有同样的问题 - 在类路径上有两个或多个 bouncycastle 版本。您应该检查 grails 依赖报告并排除不需要的。 我遇到了同样的问题,因为我的全局 lib 文件夹中有 bcprov-jdk15on-147.jar 并且我的应用程序在其 lib 文件夹中嵌入了 bcprov-jdk15on-1.51.jar,这导致了这个冲突类加载器。从全局 lib 文件夹中删除 1.47 后,我的问题得到了解决。 【参考方案1】:

我认为这是因为从类路径中引用了两个版本的 JAR。

这通常是在加载不同版本的 bcprov-jdk*.jar 时引起的。

For example, IN one of my scenario - I had 

..../webapps/FOO/WEB-INF/lib/bcprov-jdk15on-147.jar
..../webapps/FOO/WEB-INF/lib/bcprov-jdk15on-1.51.jar 

从我的类路径中删除其中任何一个后,我解决了这个问题。

【讨论】:

很好,就像一个魅力。由于我处理了一个多模块 Maven 项目,因此它帮助我搜索了它的来源: mvn dependency:tree -Dverbose -Dincludes=org.bouncycastle【参考方案2】:

就我而言,这是org.bouncycastle:bcprov-jdk15on:jar:1.47org.bouncycastle:bcprov-jdk15on:jar:1.45 的版本冲突。我在我的 Maven 项目中发现了运行 mvn dependency:tree 的问题。在 1.45 版中,DEREncodableVectorASN1EncodableVector 的父级,但在 1.47 版中则相反!!!根据哪个 JAR 版本首先加载每个类,您可能会遇到此问题,或者如果您很幸运,那么它不会发生,这是一种概率事件。

我通过删除传递依赖项之一解决了问题。我选择删除旧的。这就是我在pom.xml 中的做法:

...
 <dependency>
            <groupId>org.opensaml</groupId>
            <artifactId>xmltooling</artifactId>
            <version>1.3.2-1</version>
            <exclusions>
                <exclusion>
                    <artifactId>log4j-over-slf4j</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>jcl-over-slf4j</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>bcprov-jdk15</artifactId>
                    <groupId>org.bouncycastle</groupId>
                </exclusion>
            </exclusions>
...

【讨论】:

以上是关于避免 grails 中的循环引用继承的主要内容,如果未能解决你的问题,请参考以下文章

如何避免 activesupport 中的循环参数引用警告

当一个表中的两列指向另一个表中的主键时,避免循环引用

避免在Excel中循环引用

EF6:如何避免循环引用?

json数据避免$ref 循环引用

Json.NET如何避免循环引用