Integración de org.apache.poi y el paquete javax.xml.stream.*(stax-api) en Android: ¿cómo configurar el argumento de la biblioteca central en Android Studio?
android-studio apache-poi (1)
Estoy usando Android Studio 1.5.1
Me gustaría incluir la biblioteca org.apache.poi-ooxml en mi proyecto de Android. Para incluir esa biblioteca necesitaba incluir otras dependencias de biblioteca, entre las que se encuentra la biblioteca stax-api.
El problema con stax api es que tiene todos los paquetes en javax. * Que es una "biblioteca central". Java jdk tiene todas estas bibliotecas incluidas, así que si lo utilizara en Java SE, no necesitaría esa biblioteca stax-api. Android, por otro lado, tiene una biblioteca "parcial" de stax-api. Para Android solo necesito el paquete javax.xml.stream. *. Eso significa que necesito extraer el stax-api, eliminar todo excepto el paquete javax.xml.stram y volver a empaquetarlo.
Así que supongo que es seguro usar esta biblioteca modificada en Android. Pero tiene el paquete javax. *, Que, según Android studio es una biblioteca central, por lo que Android Studio (o cualquier componente de Android Studio) me da una advertencia:
problema al procesar "javax / xml / stream / EventFilter.class":
Uso desaconsejado o erróneo de una clase principal (java. * O javax. *) Cuando no se crea una biblioteca principal.
Esto suele deberse a la inclusión involuntaria de un archivo de la biblioteca central en el proyecto de su aplicación, cuando se usa un IDE (como Eclipse). Si está seguro de que no está definiendo intencionalmente una clase principal, entonces esta es la explicación más probable de lo que está sucediendo.
Sin embargo, es posible que esté intentando definir una clase en un espacio de nombres central, cuya fuente puede haber tomado, por ejemplo, de un proyecto de máquina virtual que no sea Android. Esto seguramente no funcionará. Como mínimo, pone en peligro la compatibilidad de su aplicación con futuras versiones de la plataforma. También es a menudo de legalidad cuestionable.
Si realmente tiene la intención de crear una biblioteca central, que es solo apropiada como parte de la creación de una distribución completa de máquinas virtuales, en lugar de compilar una aplicación, entonces use la opción "--core-library" para suprimir este mensaje de error.
Si sigue adelante y usa "--core-library" pero en realidad está creando una aplicación, tenga en cuenta que su aplicación aún no podrá compilarse o ejecutarse, en algún momento. Prepárese para los clientes enojados que, por ejemplo, descubren que su aplicación deja de funcionar una vez que actualizan su sistema operativo. Usted será el culpable de este problema.
Si está utilizando legítimamente algún código que está en un paquete central, entonces la alternativa segura más fácil que tiene es volver a empaquetar ese código. Es decir, mueva las clases en cuestión a su propio espacio de nombre de paquete. Esto significa que nunca estarán en conflicto con las clases del sistema central. JarJar es una herramienta que puede ayudarte en este esfuerzo. Si descubres que no puedes hacer esto, entonces eso es una indicación de que el camino en el que te encuentras en última instancia te llevará al dolor, el sufrimiento, el dolor y la lamentación.
Por lo tanto, me gustaría usar esta opción --core-library. ¿Pero dónde ponerlo?
Ya miré a Android Studio ignorar - el indicador de la biblioteca de resultados que no me ayudó. Creo que esas respuestas están desactualizadas, y es por eso que estoy haciendo una nueva pregunta.
Lo que intenté:
build.gradle:
dexOptions { coreLibrary true; }
build.gradle:
dexOptions { preDexLibraries = false } project.tasks.withType(com.android.build.gradle.tasks.Dex) { additionalParameters=[''--core-library''] }
Archivo -> Otras configuraciones -> Configuraciones predeterminadas -> Compiladores -> Compiladores de Android y marque la casilla ''Agregar - marcador de biblioteca de eventos''
Ninguno de estos funcionó. ¿Hay alguna manera de configurar esa opción?
EDITAR: ¿Por qué necesito STAX ? Estoy haciendo algunas cosas con el libro de trabajo, hojas , columnas, celdas para archivos .xlsx. Cuando poi-ooxml-3.14-beta1-20151223.jar
solo poi-ooxml-3.14-beta1-20151223.jar
un error en el tiempo de compilación que dice el class file for org.apache.poi.ss.usermodel.Workbook not found
.
Al incluir poi-3.14-beta1-20151223.jar en el tiempo de ejecución, entre otros, Could not find method org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook.isSetBookViews, referenced from method org.apache.poi.xssf.usermodel.XSSFWorkbook
.
Al incluir poi-ooxml-schemas-3.14-beta1-20151223.jar
durante el tiempo de ejecución, obtengo, entre otros, Failed resolving Lorg/openxmlformats/schemas/spreadsheetml/x2006/main/CTWorkbook; interface 59 ''Lorg/apache/xmlbeans/XmlObject;
Failed resolving Lorg/openxmlformats/schemas/spreadsheetml/x2006/main/CTWorkbook; interface 59 ''Lorg/apache/xmlbeans/XmlObject;
y java.lang.VerifyError: org/apache/poi/xssf/usermodel/XSSFWorkbook
Al incluir xmlbeans-2.6.0.jar
durante el tiempo de ejecución, entre otros, Could not find method javax.xml.stream.events.Namespace.getPrefix, referenced from method org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.getQName
y java.lang.NoClassDefFoundError: javax.xml.stream.XMLEventFactory at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.<clinit>(PackagePropertiesMarshaller.java:41)
ACTUALIZACIÓN Entonces, desde http://poi.apache.org/faq.html#faq-N1017E
18. ¿Por qué obtengo un java.lang.NoClassDefFoundError: javax / xml / stream / XMLEventFactory.newFactory ()
Este error indica que la clase XMLEventFactory no proporciona la funcionalidad de la que depende POI. Puede haber varias razones diferentes para esto:
Desactualizado xml-apis.jar, stax-apis.jar o xercesImpl.jar:
- Estas bibliotecas fueron necesarias con Java 5 e inferior, pero en realidad no son necesarias con implementaciones de Java 6 compatibles con las especificaciones, así que intente eliminar esas bibliotecas de su classpath. Si esto no es posible, intente actualizar a una versión más reciente de esos archivos jar.
- Ejecutando IBM Java 6 (potencialmente como parte de WebSphere Application Server): IBM Java 6 no proporciona todas las interfaces requeridas por los estándares XML, solo IBM Java 7 parece proporcionar las interfaces correctas, así que intente actualizar su JDK.
- Sun / Oracle Java 6 con nivel de parche desactualizado: algunas de las interfaces solo se incluyeron / arreglaron en algunos de los niveles de parche para Java 6. Intente ejecutar con el último nivel de parche disponible o incluso mejor use Java 7/8, donde esta funcionalidad debería estar disponible en todos casos.
Entonces, si leo esto correctamente, en Android, necesito una api STAX "truncada".
Hay varios problemas cuando intenta usar el PDI de Apache y depende de las bibliotecas en una aplicación de Android. Entre otros, hay clases duplicadas en xmlbeans.jar, los paquetes "javax. *" Están prohibidos por el compilador de Android y algunos otros.
Actualmente hay dos proyectos que intentan solucionar esos problemas:
android5xlsx proporciona archivos jar listos para incluir en su aplicación, pero actualmente utiliza una versión un tanto obsoleta de POI. poi-on-android se basa en POI 3.15-beta1 y puede volver a compilarse para versiones más recientes de POI con bastante facilidad. Ambos proyectos son para Android 5+ y vienen con código de ejemplo y deberían permitir el uso básico de Apache POI en Android.