Проблема с зависимостями Android - ApachePOI & fastxml - PullRequest
0 голосов
/ 31 января 2019

В настоящее время я разрабатываю приложение для Android, которое требуется для чтения / записи данных из / в электронную таблицу Excel ( .xls или .xlsx ).

Для интеграции Android <-> Excel я использую эту библиотеку poi , главным образом потому, что у меня были некоторые проблемы с правильной настройкой зависимостей к исходному Apache POI .

Примечание: В случае выполненного действия (нажатия кнопки) создается экземпляр объекта книги как таковой this.workbook = new XSSFWorkbook(super.file);

Ниже приводится содержимое моего build.gradle (модуль) файл:

apply plugin: 'com.android.application
android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.ricardomiranda.expenses"
        minSdkVersion 24
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    // Workaround - "Program type already present"
    dexOptions {
        preDexLibraries = false
    }

}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:design:27.1.1'

    // Workaround - "com.bea.xml.stream.EventFactory not found"
    implementation('com.fasterxml:aalto-xml:1.0.0'){
        // Workaround - "Program type already present"
        exclude module: 'stax'
        exclude module: 'stax-api'
        exclude module: 'xpp3'
        exclude group: 'com.android.support'
        exclude module: 'support-v7'
        exclude module: 'fasterxml'
    }

    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation files('libs/poishadow-all.jar')
}`

Как можно заметить, в предыдущем фрагменте кода есть некоторые обходные пути (правильно выделенные в комментариях), чтобы попытаться решить проблемы, с которыми я сталкиваюсь,пока безрезультатно.

Проблемы:

Рассмотрим предыдущий build.gradle фрагмент кода без обходных путей

  1. Сборка успешно выполнена и приложениезапущен.При нажатии кнопки выполняется вышеупомянутая строка: this.workbook = new XSSFWorkbook(super.file);, а также некоторые другие классы и методы, унаследованные от библиотеки poi - эта кнопка пытается записать данные в электронную таблицу Excel.Однако ожидаемое поведение не применяется, так как выполнение прерывается с «фатальным исключением» следующим образом:

`

2019-01-31 18:35:14.377 20682-20682/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.ricardomiranda.expenses, PID: 20682
    org.apache.poi.javax.xml.stream.FactoryConfigurationError: Provider com.bea.xml.stream.EventFactory not found
        at org.apache.poi.javax.xml.stream.FactoryFinder.newInstance(FactoryFinder.java:72)
        at org.apache.poi.javax.xml.stream.FactoryFinder.find(FactoryFinder.java:178)
        at org.apache.poi.javax.xml.stream.FactoryFinder.find(FactoryFinder.java:92)
        at org.apache.poi.javax.xml.stream.XMLEventFactory.newInstance(XMLEventFactory.java:30)
        at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.<clinit>(PackagePropertiesMarshaller.java:41)
        at org.apache.poi.openxml4j.opc.OPCPackage.init(OPCPackage.java:161)
        at org.apache.poi.openxml4j.opc.OPCPackage.<init>(OPCPackage.java:141)
        at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:130)
        at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:295)
        at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:201)
        at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:323)
        at com.ricardomiranda.expenses.ExcelManagement.initializeWorkbook(ExcelManagement.java:141)
        at com.ricardomiranda.expenses.ExcelManagement.<init>(ExcelManagement.java:51)
        at com.ricardomiranda.expenses.AddExpense$1.onClick(AddExpense.java:44)
        at android.view.View.performClick(View.java:6291)
        at android.view.View$PerformClick.run(View.java:24931)
        at android.os.Handler.handleCallback(Handler.java:808)
        at android.os.Handler.dispatchMessage(Handler.java:101)
        at android.os.Looper.loop(Looper.java:166)
        at android.app.ActivityThread.main(ActivityThread.java:7529)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)

Для устранения проблемы ив этом комментарии я добавил следующую зависимость в свою сборку implementation('com.fasterxml:aalto-xml:1.0.0') и установил необходимые системные свойства (также описанные в разделе Начало работы документации README библиотеки).

Перезапуск приложения после применения прежних изменений приводит к следующей ошибке, на этот раз во время сборки проекта: Error: Program type already present: com.fasterxml.aalto.ValidationException

Насколько я могу судить, это похоже на Дублированная проблема зависимостей , но я не могу решить gradlew app:dependencies (вывод слишком обширный), и никакие конфигурации не выводятся аналогичными командами.

...