2011-05-23 17 views
9

He creado un proyecto de Grails con POI (incluya poi-3.7 y poi-ooxml-3.7). He agregado estas 2 bibliotecas externas al bloque de dependencias en el archivo BuildConfig.groovy de mi proyecto. No hay nada extraño cuando lo compilé. Pero cuando me llamó el comando "run-app" para ese proyecto, ocurrió un error con la continuación StackTrace:java.lang.LinkageError: violación de la restricción del cargador en el proyecto de 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 

Y aquí es mi configuración:

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

¿Cómo puedo hacer para que resolver este ? Muchas gracias!

+0

Hola ... Tengo mismo problema esperan que el tipo que es con el nombre "javax/gestión/MBeanServer". Realmente no sé por dónde empezar y me está volviendo loco. ¿Me puede dar alguna pista? – Rafael

Respuesta

11

Aquí está la solución que finalmente encontramos después de varias horas de ida y vuelta. En resumen, excluya xmlbeans de poi y cree otro jar de xmlbeans con la clase ofensiva eliminada. Aquí está el conjuro para exorcizar el error de vinculación malvado.

  • Modificar BuildConfig.groovy

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

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

  • quitar Paquete clase infractor

    cd org
    rm-rf W3C/

  • recrear el frasco

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

  • Copia cántaro en sus proyectos lib

    cp xmlbean-2.3.0.jar your_grails_project/lib /.

  • mostrar el amor

    clic respuesta flecha hacia arriba. :)

+0

Gracias, esto corrigió mi problema LinkageError con un punto de interés de Apache y Batik. –

+0

Esto funciona para Grails 1.3.6 y POI 3.8. También borré .grails y .ivy2, pero no estoy seguro de que sea necesario. – Joseph

0

No sé si esto solucionará su problema, pero supongo que su dependencia de los POI debería ser en tiempo de compilación. Intente cambiar sus dependencias a:

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

Sí, gracias por su sugerencia. Lo intenté, pero todavía no funciona. Con el error: java.lang.LinkageError: violación de restricción de cargador: cargador (instancia de ) carga iniciada previamente para un tipo diferente con el nombre "org/w3c/dom/DOMConfiguration", lo he comprobado nuevamente, y hay 2 clases DOMConfiguration en 2 paquetes jar diferentes: xmlbeans-2.3.0.jar y en jdk. Entonces creo que esa es la razón principal que causa el error. Pero no sé cómo resolverlo, porque necesito la biblioteca poi-ooxml para mi proyecto mientras xmlbeans-2.3. es una de sus dependencias. –

+0

Tengo una idea para resolver esto, es decir, excluir el paquete org.w3c.dom en xmlbeans jar, pero no sé cuál es la sintaxis correcta para hacer esto en BuildConfig. Aquí está mi juicio: siempre ('com.oracle:ojdbc6_g:11.2.0.1.0') tiempo de ejecución ('org.apache.poi: poi: 3,7', 'org.apache.poi: poi-OOXML: 3.7') { excluye "org.w3c.dom" }. Pero no funciona –

1

Hay un conflicto entre una de las dependencias de los PI (xmlbeans) y los griales. Puede excluirlo de la siguiente manera:

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

Los siguientes enlaces fueron útiles para localizar el problema:

+0

Sí, podemos excluir la dependencia xmlbeans de poi-ooxml para iniciar la aplicación con éxito, pero obtendremos ClassDefNotFoundException al ejecutar la aplicación. Porque algunas clases en poi-ooxml realmente dependen de las clases de xmlbeans jar. –

1

que tenía un problema similar y que era un problema de caché Eliminé el directorio .grails y .ivy2 (debajo del hogar) y resolvió mis problemas. Buena suerte.

1

Supongo que soluciono este problema. La solución de Steve Wall no quiere funcionar en Grails 2.0.0 debido a la falta de memoria de Perm gen/durante la ejecución de la aplicación "grails-app".

BuildConfig.groovy

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

luego descargar xbean-2.1.0.jar, y aplicar la solución de 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/ 

Para mí funciona bien! ¡Buena suerte!

Cuestiones relacionadas