Używam Android Studio 1.5.1integracja org.apache.poi i pakietu javax.xml.stream. * (Stax-api) w Androidzie - jak ustawić argument --core-library w Android Studio?
Chciałbym dołączyć bibliotekę org.apache.poi-ooxml do mojego projektu Android. Aby dołączyć tę bibliotekę, musiałem dołączyć kilka innych zależności bibliotek, między innymi bibliotekę stax-api.
Problem ze stax api polega na tym, że ma on wszystkie pakiety w javax. * Który jest "biblioteką rdzeniową". Java jdk zawiera wszystkie te biblioteki, więc gdybym używał go w Java SE, nie potrzebowałbym tej biblioteki stax-api. Z drugiej strony Android ma "częściową" bibliotekę stax-api. Dla Androida potrzebuję tylko pakietu javax.xml.stream. *. Oznacza to, że muszę wyodrębnić stax-api, usunąć wszystko poza pakietem javax.xml.stram i ponownie spakować go ponownie.
Sądzę więc, że korzystanie z tej zmodyfikowanej biblioteki w systemie Android jest bezpieczne. Ale to ma javax * opakowanie, które zgodnie z Android Studio to biblioteka rdzeń, więc Android Studio (lub cokolwiek składnikiem Android Studio) daje mi ostrzeżenie.
trouble processing "javax/xml/stream/EventFilter.class":
Ill-advised or mistaken usage of a core class (java.* or javax.*) when not building a core library.
This is often due to inadvertently including a core library file in your application's project, when using an IDE (such as Eclipse). If you are sure you're not intentionally defining a core class, then this is the most likely explanation of what's going on.
However, you might actually be trying to define a class in a core namespace, the source of which you may have taken, for example, from a non-Android virtual machine project. This will most assuredly not work. At a minimum, it jeopardizes the compatibility of your app with future versions of the platform. It is also often of questionable legality.
If you really intend to build a core library -- which is only appropriate as part of creating a full virtual machine distribution, as opposed to compiling an application -- then use the "--core-library" option to suppress this error message.
If you go ahead and use "--core-library" but are in fact building an application, then be forewarned that your application will still fail to build or run, at some point. Please be prepared for angry customers who find, for example, that your application ceases to function once they upgrade their operating system. You will be to blame for this problem.
If you are legitimately using some code that happens to be in a core package, then the easiest safe alternative you have is to repackage that code. That is, move the classes in question into your own package namespace. This means that they will never be in conflict with core system classes. JarJar is a tool that may help you in this endeavor. If you find that you cannot do this, then that is an indication that the path you are on will ultimately lead to pain, suffering, grief, and lamentation.
Więc chciałbym używać tej opcji --core-library. Ale gdzie go ustawić?
Już obejrzałem Android Studio ignore --core-library flag, które nie pomogło mi. Myślę, że te odpowiedzi są nieaktualne i dlatego zadaję nowe pytanie.
Co zrobiłem spróbować:
build.gradle:
dexOptions { coreLibrary true; }
build.gradle:
dexOptions { preDexLibraries = false } project.tasks.withType(com.android.build.gradle.tasks.Dex) { additionalParameters=['--core-library'] }
File -> Inne ustawienia - > Ustawienia domyślne -> Kompilatory -> Kompilatory Androida i zaznacz opcję "Dodaj flagę-biblioteki"
Żadna z tych opcji nie zadziałała. Czy jest jakiś sposób na ustawienie tej opcji?
EDIT: Dlaczego muszę Stax: robię pewne rzeczy ze skoroszytu arkusza, kolumn, komórek dla plików .xlsx. Po dodaniu tylko poi-ooxml-3.14-beta1-20151223.jar
pojawia się błąd w czasie kompilacji z informacją: class file for org.apache.poi.ss.usermodel.Workbook not found
.
Po dołączeniu pliku poi-3.14-beta1-20151223.jar w czasie wykonywania otrzymuję między innymi Could not find method org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook.isSetBookViews, referenced from method org.apache.poi.xssf.usermodel.XSSFWorkbook
.
Po tym poi-ooxml-schemas-3.14-beta1-20151223.jar
podczas wykonywania uzyskać m.in. Failed resolving Lorg/openxmlformats/schemas/spreadsheetml/x2006/main/CTWorkbook; interface 59 'Lorg/apache/xmlbeans/XmlObject;
i java.lang.VerifyError: org/apache/poi/xssf/usermodel/XSSFWorkbook
Po tym xmlbeans-2.6.0.jar
podczas wykonywania uzyskać m.in. Could not find method javax.xml.stream.events.Namespace.getPrefix, referenced from method org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.getQName
i java.lang.NoClassDefFoundError: javax.xml.stream.XMLEventFactory at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.<clinit>(PackagePropertiesMarshaller.java:41)
UPDATE Więc od http://poi.apache.org/faq.html#faq-N1017E
18. Why do I get a java.lang.NoClassDefFoundError: javax/xml/stream/XMLEventFactory.newFactory()
This error indicates that the class XMLEventFactory does not provide functionality which POI is depending upon. There can be a number of different reasons for this:
Outdated xml-apis.jar, stax-apis.jar or xercesImpl.jar:
- These libraries were required with Java 5 and lower, but are not actually required with spec-compliant Java 6 implementations, so try removing those libraries from your classpath. If this is not possible, try upgrading to a newer version of those jar files.
- Running IBM Java 6 (potentially as part of WebSphere Application Server): IBM Java 6 does not provide all the interfaces required by the XML standards, only IBM Java 7 seems to provide the correct interfaces, so try upgrading your JDK.
- Sun/Oracle Java 6 with outdated patchlevel: Some of the interfaces were only included/fixed in some of the patchlevels for Java 6. Try running with the latest available patchlevel or even better use Java 7/8 where this functionality should be available in all cases.
Więc, jeśli ja Miejmy to poprawnie, w Androidzie potrzebuję "skróconego" apara STAX.
STAX nie jest wymagany przez najnowsze wersje Apache POI. Co się stanie, jeśli spróbujesz uaktualnić? – Gagravarr
Zaktualizowałem pytanie, aby "uzasadnić" użycie STAX – SlumpA
Zobacz [strona komponentów Apache POI] (http://poi.apache.org/overview.html#components), aby dowiedzieć się, jakie punkty POI mają zależności - postępując zgodnie z radą, naprawię brakujące pytania dotyczące klasy – Gagravarr