2011-05-23 86 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/ 

對我來說它工作正常!祝你好運!