2016-01-05 32 views
18

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ć:

  1. build.gradle:

    dexOptions { 
        coreLibrary true; 
    } 
    
  2. build.gradle:

    dexOptions { 
        preDexLibraries = false 
    } 
    
    project.tasks.withType(com.android.build.gradle.tasks.Dex) { 
        additionalParameters=['--core-library'] 
    } 
    
  3. 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.

+0

STAX nie jest wymagany przez najnowsze wersje Apache POI. Co się stanie, jeśli spróbujesz uaktualnić? – Gagravarr

+0

Zaktualizowałem pytanie, aby "uzasadnić" użycie STAX – SlumpA

+0

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

Odpowiedz

3

Istnieje wiele problemów podczas próby użycia Apache POI i jego bibliotek zależnych w aplikacji Android. Między innymi są zduplikowane klasy w pliku xmlbeans.jar, pakiety "javax. *" Są zabronione przez kompilator Androida i kilka innych.

Obecnie istnieją dwa projekty, które próbują rozwiązać te problemy:

android5xlsx zapewnia gotowe słoik pliki uwzględnić w aplikacji, ale obecnie używa nieco przestarzałej wersji UM. Poi-on-android bazuje na POI 3.15-beta1 i można go zrekompilować dla nowszych wersji POI dość łatwo. Oba projekty są dla systemu Android 5+ i dostarczane z przykładowym kodem i powinny umożliwiać podstawowe korzystanie z Apache POI na Androidzie.

+0

Dzięki za ciężką pracę! Czy mogę zadać ci dwa pytania?Po pierwsze, dlaczego większość takich projektów obsługuje tylko Androida 5+? Masz problem z obsługą niższych wersji w tym samym czasie? Po drugie, jeśli muszę napisać dla Androida 4.4 i wyżej, który projekt byłby dla mnie najlepszy? Widziałem, że wspomniałeś również o AndroidReadXLSX w innej odpowiedzi. (Aplikacja musi czytać zarówno XLS, jak i XLSX!). – Jenix

+0

Och, zapomniałem zadać to pytanie. Czy wystąpił problem z pamięcią przy użyciu tych projektów? Nie mam doświadczenia z plikami Excel na Androida, więc nieco martwię się urządzeniami low-end. – Jenix