2011-05-23 40 views
9

我已经构建了一个包含POI(包含poi-3.7和poi-ooxml-3.7)的Grails项目。我已经将这两个外部库添加到我的项目的BuildConfig.groovy文件中的依赖项中。编译它时没有什么奇怪的。但是,当我打电话命令“运行程序”该项目,以低于堆栈跟踪中出现错误:java.lang.LinkageError:Grails项目中加载器约束违规

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') 
    } 

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

+0

嗨...我有同样的问题期望与名称“javax/management/MBeanServer”类型。我真的不知道从哪里开始,这让我发疯。你能给我任何提示吗? – Rafael 2015-02-03 13:55:52

回答

11

这是我们终于来了几个小时后来回来的修复。简而言之,从poi中排除xmlbeans,并删除违规类的另一个xmlbeans jar。这是煽动邪恶联系错误的咒语。

  • 修改BuildConfig.groovy

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

    CD〜
    的mkdir xmlbeantmp
    CD xmlbeantmp
    CP〜/ .ivy2 /缓存/组织。 apache.xmlbeans /的xmlbeans /罐/的xmlbeans-2.3.0.jar 。
    罐XF的xmlbeans-2.3.0.jar

  • 拆下犯罪类包

    CD有机
    室射频W3C/

  • 重新创建罐子

    CD ../
    rm xmlbean-2.3.0.jar
    jar cf xmlbean-2.3.0。罐子*

  • 罐子复制到项目的lib

    CP的XMLBean-2.3.0.jar your_grails_project/lib中/。

  • 显示爱

    点击答案向上箭头。 :)

+0

谢谢,这解决了我的LinkageError问题与Apache POI和蜡染。 – 2012-04-23 12:57:04

+0

这适用于grails 1.3.6和POI 3.8。我也清除了.grails和.ivy2,但并不肯定它是必需的。 – Joseph 2013-04-08 17:56:29

0

我不知道这是否会解决您的问题,但我的猜测是,您对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') 
} 
+0

是的,谢谢你的建议。我试过了,但它仍然不起作用。错误:java.lang.LinkageError:加载器约束违例:加载器(实例)以前启动加载一个名称为“org/w3c/dom/DOMConfiguration”的不同类型,我再次检查它,并且有2个在两个不同的jar包中使用DOMConfiguration:xmlbeans-2.3.0.jar和jdk。所以我认为这是导致错误的主要原因。但我不知道如何解决,因为我需要为我的项目使用poi-ooxml库,而xmlbeans-2.3。是其依赖之一。 – 2011-05-24 01:40:00

+0

我有一个想法来解决这个问题,那就是不包含xmlbeans jar包中的org.w3c.dom包,但是我不知道在BuildConfig中这样做的正确语法是什么。这里是我的试用版:provided('com.oracle:ojdbc6_g:11.2.0.1.0') runtime('org.apache.poi:poi:3.7','org.apache.poi:poi-ooxml:3.7') { 不包括“org.w3c.dom” }。但它不起作用 – 2011-05-24 02:24:34

1

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

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

以下链接是在追查问题有用:

+0

是的,我们可以从poi-ooxml中排除依赖xmlbeans以启动应用程序成功,但是在运行应用程序时我们会得到ClassDefNotFoundException。因为poi-ooxml中的一些类实际上依赖于xmlbeans jar类。 – 2011-06-21 10:49:35

1

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

1

我想我解决了这个问题。 史蒂夫沃尔的解决方案在Grails 2.0.0上不适合我,因为“grails run-app”期间的Perm gen space /内存不足。

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,并申请史蒂夫墙解决方案:

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/ 

对我来说它工作正常!祝你好运!

相关问题