【问题标题】:java.lang.LinkageError: loader constraint violation in Grails projectjava.lang.LinkageError:Grails 项目中的加载程序约束冲突
【发布时间】:2011-08-31 03:15:31
【问题描述】:

我用 POI 构建了一个 Grails 项目(包括 poi-3.7 和 poi-ooxml-3.7)。我已将这 2 个外部库添加到项目的 BuildConfig.groovy 文件中的依赖项块中。我编译的时候没有什么奇怪的。但是当我为该项目调用命令“run-app”时,下面的堆栈跟踪发生了错误:

Base Directory: <path-to-my-project>
Resolving dependencies...
Dependencies resolved in 5546ms.
Running script D:\_TOOLS\STS\grails-1.3.5\scripts\RunApp.groovy
Environment set to development
Running Grails application..
2011-05-23 18:51:01,225 [main] ERROR context.GrailsContextLoader  - Error executing bootstraps: java.lang.LinkageError: loader constraint violation: loader (instance of <bootloader>) previously initiated loading for a different type with name "org/w3c/dom/DOMConfiguration"
org.codehaus.groovy.runtime.InvokerInvocationException: java.lang.LinkageError: loader constraint violation: loader (instance of <bootloader>) previously initiated loading for a different type with name "org/w3c/dom/DOMConfiguration"
    at grails.spring.BeanBuilder.invokeBeanDefiningClosure(BeanBuilder.java:723)
    at grails.spring.BeanBuilder.beans(BeanBuilder.java:573)
    at grails.spring.BeanBuilder.invokeMethod(BeanBuilder.java:519)
    at org.grails.tomcat.TomcatServer.start(TomcatServer.groovy:212)
    at grails.web.container.EmbeddableServer$start.call(Unknown Source)
    at RunApp$_run_closure5_closure12.doCall(RunApp:158)
    at RunApp$_run_closure5_closure12.doCall(RunApp)
    at _GrailsSettings_groovy$_run_closure10.doCall(_GrailsSettings_groovy:280)
    at _GrailsSettings_groovy$_run_closure10.call(_GrailsSettings_groovy)
    at RunApp$_run_closure5.doCall(RunApp:149)
    at RunApp$_run_closure5.call(RunApp)
    at RunApp.runInline(RunApp:116)
    at RunApp.this$4$runInline(RunApp)
    at RunApp$_run_closure1.doCall(RunApp:59)
    at RunApp$_run_closure1.doCall(RunApp:33)
    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$this$2$withBuildListeners.callCurrent(Unknown Source)
    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:590)
    at gant.Gant.executeTargets(Gant.groovy:589)

Caused by: java.lang.LinkageError: loader constraint violation: loader (instance of <bootloader>) previously initiated loading for a different type with name "org/w3c/dom/DOMConfiguration"
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
    at java.lang.Class.getDeclaredMethods(Class.java:1791)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46)
    at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33)
    at grails.spring.DynamicElementReader.invokeMethod(DynamicElementReader.groovy:121)
    ... 26 more  

这是我的配置:

dependencies {  
        provided ('com.oracle:ojdbc6_g:11.2.0.1.0')  
        runtime ('org.apache.poi:poi:3.7', 'org.apache.poi:poi-ooxml:3.7')  
    }  

我该怎么做才能解决这个问题?非常感谢!

【问题讨论】:

  • 嗨......我有同样的问题,期望名称为“javax/management/MBeanServer”的类型。我真的不知道从哪里开始,这让我发疯。能给我一点提示吗?

标签: grails dependencies linkage run-app


【解决方案1】:

我不知道这是否能解决你的问题,但我猜你对 POI 的依赖可能应该是编译时的。尝试将依赖项更改为:

dependencies {  
    provided ('com.oracle:ojdbc6_g:11.2.0.1.0')  
    compile ('org.apache.poi:poi:3.7', 'org.apache.poi:poi-ooxml:3.7')  
}  

【讨论】:

  • 好的,谢谢您的建议。我试过了,但还是不行。出现错误:java.lang.LinkageError:加载程序约束违规:加载程序( 的实例)先前启动了名为“org/w3c/dom/DOMConfiguration”的不同类型的加载,我再次检查了它,然后是 2 个不同 jar 包中的 2 个类 DOMConfiguration:xmlbeans-2.3.0.jar 和 jdk。所以我认为这是导致错误的主要原因。但我不知道如何解决,因为我的项目需要 poi-ooxml 库,而 xmlbeans-2.3。是它的依赖项之一。
  • 我有一个想法来解决这个问题,即排除 xmlbeans jar 中的包 org.w3c.dom,但我不知道在 BuildConfig 中执行此操作的正确语法是什么。这是我的试用版:提供的 ('com.oracle:ojdbc6_g:11.2.0.1.0') 运行时 ('org.apache.poi:poi:3.7', 'org.apache.poi:poi-ooxml:3.7') {不包括“org.w3c.dom”}。但它不起作用
【解决方案2】:

POI 的依赖项之一(xmlbeans)和 grails 之间存在冲突。您可以按如下方式排除它:

dependencies {
    compile('org.apache.poi:poi-ooxml:3.7') { excludes "xmlbeans" }
}

以下链接有助于追踪问题:

【讨论】:

  • 是的,我们可以从poi-ooxml中排除依赖xmlbeans来启动应用程序成功,但是我们在运行应用程序时会得到ClassDefNotFoundException。因为 poi-ooxml 中的一些类实际上是依赖于 xmlbeans jar 的类。
【解决方案3】:

我遇到了类似的问题,这是一个缓存问题。我删除了 .grails 和 .ivy2 目录(在主目录下),它解决了我的麻烦。祝你好运。

【讨论】:

    【解决方案4】:

    这是我们在来回几个小时后终于解决的问题。简而言之,从 poi 中排除 xmlbeans 并创建另一个 xmlbeans jar 并删除有问题的类。这是驱邪联结错误的咒语。

    • 修改 BuildConfig.groovy
    
        dependencies {
           compile ('org.apache.poi:poi-ooxml:3.6') {excludes "xmlbeans"}
        }
    
    • 提取 xmlbeans

      光盘~
      mkdir xmlbeantmp
      cd xmlbeantmp
      cp ~/.ivy2/cache/org.apache.xmlbeans/xmlbeans/jars/xmlbeans-2.3.0.jar .
      jar xf xmlbeans-2.3.0.jar

    • 删除违规类包

      cd 组织
      rm -rf w3c/

    • 重新创建 jar

      cd ../
      rm xmlbean-2.3.0.jar
      jar cf xmlbean-2.3.0.jar *

    • 将 jar 复制到您的项目库中

      cp xmlbean-2.3.0.jar your_grails_project/lib/.

    • 表达爱

      点击回答向上箭头。 :)

    【讨论】:

    • 谢谢,这解决了我使用 Apache POI 和 Batik 的 LinkageError 问题。
    • 这适用于 grails 1.3.6 和 POI 3.8。我还清除了 .grails 和 .ivy2,但并不肯定它是必需的。
    【解决方案5】:

    我想我解决了这个问题。 由于 Perm gen 空间/“grails run-app”期间内存不足,Steve Wall 的解决方案不想在 grails 2.0.0 上为我工作。

    BuildConfig.groovy

    ....
    inherits("global") {
        excludes 'xmlbeans', 'xbean'
    }
    ....
    runtime 'xmlbeans:xmlpublic:2.1.0'
    runtime 'org.apache.poi:poi-ooxml:3.7'
    ....
    

    然后下载xbean-2.1.0.jar,应用Steve Wall的解决方案:

    jar xf xbean-2.1.0.jar
    cd org
    rm -rf w3c/
    cd ..
    rm xbean-2.1.0.jar
    jar cf xbean-2.1.0.patched.jar *
    cp xbean-2.1.0.patched.jar your_grails_project/lib/
    

    对我来说效果很好!祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 2018-04-04
      • 2021-08-04
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多