Подтвердить что ты не робот

Интегрируя org.apache.poi и пакет javax.xml.stream. * (stax-api) в android - как установить аргумент -core-library в Android Studio?

Я использую Android studio 1.5.1

Я хотел бы включить библиотеку org.apache.poi-ooxml в мой проект Android. Чтобы включить эту библиотеку, мне нужно было включить некоторые другие зависимости библиотеки, среди которых библиотека stax-api.

Проблема с stax api заключается в том, что он имеет все пакеты в javax. *, который является "основной библиотекой". Java jdk включает все эти библиотеки, поэтому, если бы я использовал его в Java SE, мне не понадобилась бы эта библиотека stax-api. Android, с другой стороны, имеет "частичную" библиотеку stax-api. Для android мне нужен пакет javax.xml.stream. *. Это означает, что мне нужно извлечь stax-api, удалить все, кроме пакета javax.xml.stram, и снова переупаковать его.

Поэтому я думаю, что использовать эту модифицированную библиотеку в Android можно. Но у него есть пакет javax. *, Который, согласно студии Android, является базовой библиотекой, поэтому Android Studio (или любой другой компонент в Android Studio) дает мне предупреждение:

обработка ошибок "javax/xml/stream/EventFilter.class":

Явное или ошибочное использование основного класса (java. * или javax. *), когда не создавая основную библиотеку.

Это часто происходит из-за непреднамеренного включения файла основной библиотеки в ваш проект приложения при использовании среды IDE (например, Eclipse). Если вы уверены, что вы не намеренно определяете основной класс, тогда это является наиболее вероятным объяснением того, что происходит.

Однако вы можете попытаться определить класс в ядре пространство имен, источник которого вы, возможно, взяли, например, из не-Android. Это, безусловно, не будет Работа. Как минимум, это ставит под угрозу совместимость вашего приложения с будущие версии платформы. Это также часто вызывает сомнения Законность.

Если вы действительно собираетесь создать основную библиотеку, которая только соответствующие как часть создания полного распространения виртуальной машины, в отличие от компиляции приложения, - затем используйте "--core-library" для подавления этого сообщения об ошибке.

Если вы продолжаете использовать "--core-library", но на самом деле приложения, то следует предупредить, что ваше приложение все равно будет строить или запускать, в какой-то момент. Пожалуйста, будьте готовы к сердитым клиентам которые, например, находят, что ваше приложение перестает функционировать один раз они обновляют свою операционную систему. Вы будете виноваты в этом проблема.

Если вы законно используете какой-то код, который находится в ядре пакет, тогда самая простая безопасная альтернатива у вас есть, чтобы переупаковать это код. То есть, переместите рассматриваемые классы в свой собственный пакет Пространство имен. Это означает, что они никогда не будут в конфликте с ядром системных классов. JarJar - это инструмент, который может помочь вам в этом начинании. Если вы обнаружите, что не можете этого сделать, это свидетельствует о том, что путь, на котором вы находитесь, в конечном итоге приведет к боли, страданиям, печали, и плач.

Итак, я бы хотел использовать эту опцию --core-library. Но где его установить?

Я уже смотрел Android Studio ignore --core-library flag, который мне не помог. Я думаю, что эти ответы устарели, и почему я задаю новый вопрос.

Что я пытался:

  • build.gradle:

    dexOptions {
      coreLibrary true;
    }
    
  • build.gradle:

    dexOptions {
      preDexLibraries = false
    }
    
    project.tasks.withType(com.android.build.gradle.tasks.Dex) {
      additionalParameters=['--core-library']
    }
    
  • Файл → Другие настройки → Настройки по умолчанию → Компиляторы → Компиляторы Android и отметьте флажок "Добавить -core-library"

Ничего из этого не получилось. Есть ли способ установить этот параметр?


EDIT: зачем мне нужен STAX: Я делаю некоторые вещи с книгой, листом, столбцами, ячейками для файлов .xlsx. Когда я включаю только poi-ooxml-3.14-beta1-20151223.jar, я получаю ошибку во времени сборки, говоря class file for org.apache.poi.ss.usermodel.Workbook not found.

После включения poi-3.14-beta1-20151223.jar во время выполнения я получаю, среди прочих, Could not find method org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook.isSetBookViews, referenced from method org.apache.poi.xssf.usermodel.XSSFWorkbook.

При включении poi-ooxml-schemas-3.14-beta1-20151223.jar во время выполнения я получаю, среди прочих, Failed resolving Lorg/openxmlformats/schemas/spreadsheetml/x2006/main/CTWorkbook; interface 59 'Lorg/apache/xmlbeans/XmlObject; и java.lang.VerifyError: org/apache/poi/xssf/usermodel/XSSFWorkbook

При включении xmlbeans-2.6.0.jar во время выполнения я получаю, среди прочих, Could not find method javax.xml.stream.events.Namespace.getPrefix, referenced from method org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.getQName и java.lang.NoClassDefFoundError: javax.xml.stream.XMLEventFactory at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.<clinit>(PackagePropertiesMarshaller.java:41)

UPDATE Итак, из http://poi.apache.org/faq.html#faq-N1017E

18. Почему я получаю java.lang.NoClassDefFoundError: javax/xml/stream/XMLEventFactory.newFactory()

Эта ошибка указывает что класс XMLEventFactory не предоставляет функциональность, которая POI зависит от этого. Существует несколько разных причин для это:

Устаревший xml-apis.jar, stax-apis.jar или xercesImpl.jar:

  • Эти библиотеки требовались с Java 5 и ниже, но на самом деле они не требуются со спецификационными реализациями Java 6, поэтому попробуйте удаление этих библиотек из вашего пути к классам. Если это невозможно, попробуйте перейти на более новую версию этих файлов jar.
  • Запуск IBM Java 6 (возможно, как часть WebSphere Application Server): IBM Java 6 не предоставляет все интерфейсы, требуемые стандартов XML, только IBM Java 7, похоже, обеспечивает правильное интерфейсов, поэтому попробуйте обновить JDK.
  • Sun/Oracle Java 6 с устаревшим патчевым уровнем: некоторые из интерфейсов были включены/исправлены только в некоторых из уровней патчей для Java 6. Попробуйте работает с последним доступным патч-уровнем или даже лучше использует Java 7/8, где эта функциональность должна быть доступна во всех случаях.

Итак, если я правильно прочитал это, в Android мне нужен "усеченный" STAX api.

4b9b3361

Ответ 1

При попытке использовать Apache POI и зависящие от него библиотеки в приложении для Android существует ряд проблем. Среди других есть дубликаты классов в xmlbeans.jar, пакеты "javax. *" Запрещены компилятором Android и несколькими другими.

В настоящее время существуют два проекта, которые пытаются исправить эти проблемы:

android5xlsx предоставляет готовые jar файлы для включения в ваше приложение, но в настоящее время использует несколько устаревшую версию POI. poi-on-android основан на POI 3.15-beta1 и может быть легко перекомпилирован для более новых версий POI. Оба проекта предназначены для Android 5+ и поставляются с образцом кода и должны обеспечивать базовое использование Apache POI на Android.