Ошибка NoClassDefFoundError в Apache Poi

80
19 января 2022, 14:30

Возникла проблема, пытаюсь загрузить файл XLSX и у меня выдает ошибку, хотя при загрузке XLS файла все нормально. Как это можно исправить? Вроде, как все подключил правильно.

Код загрузки файла:

FileInputStream file = new FileInputStream(new File(Global_variable.Uri_for_picker.getPath()));
            XSSFWorkbook workbook = new XSSFWorkbook(file);
            XSSFSheet sheet = workbook.getSheetAt(0);

Gradle:

implementation 'org.apache.poi:poi:4.0.0'
implementation 'org.apache.poi:poi-ooxml:4.0.0'
implementation 'org.apache.poi:poi-ooxml-schemas:4.0.0'
implementation 'com.fasterxml:aalto-xml:1.0.0'

Ошибка:

> 12-26 14:50:55.041 10906-10906/com.example.jone1.navigation_drawer E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.jone1.navigation_drawer, PID: 10906
    java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/xml/stream/XMLEventFactory;
        at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.<clinit>(PackagePropertiesMarshaller.java:41)
        at org.apache.poi.openxml4j.opc.OPCPackage.<init>(OPCPackage.java:140)
        at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:103)
        at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:298)
        at org.apache.poi.ooxml.util.PackageHelper.open(PackageHelper.java:37)
        at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:307)
        at com.example.omen.serverforcofe.Fragment_service.onViewCreated(Fragment_service.java:366)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:993)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1153)
        at android.app.BackStackRecord.run(BackStackRecord.java:806)
        at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1565)
        at android.app.FragmentManagerImpl$1.run(FragmentManager.java:487)
        at android.os.Handler.handleCallback(Handler.java:815)
        at android.os.Handler.dispatchMessage(Handler.java:104)
        at android.os.Looper.loop(Looper.java:207)
        at android.app.ActivityThread.main(ActivityThread.java:5845)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:768)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "javax.xml.stream.XMLEventFactory" on path: DexPathList[[zip file "/data/app/com.example.jone1.navigation_drawer-1/base.apk"],nativeLibraryDirectories=[/data/app/com.example.jone1.navigation_drawer-1/lib/arm64, /vendor/lib64, /system/lib64]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
        at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.<clinit>(PackagePropertiesMarshaller.java:41) 
        at org.apache.poi.openxml4j.opc.OPCPackage.<init>(OPCPackage.java:140) 
        at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:103) 
        at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:298) 
        at org.apache.poi.ooxml.util.PackageHelper.open(PackageHelper.java:37) 
        at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:307) 
        at com.example.omen.serverforcofe.Fragment_service.onViewCreated(Fragment_service.java:366) 
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:993) 
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1153) 
        at android.app.BackStackRecord.run(BackStackRecord.java:806) 
        at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1565) 
        at android.app.FragmentManagerImpl$1.run(FragmentManager.java:487) 
        at android.os.Handler.handleCallback(Handler.java:815) 
        at android.os.Handler.dispatchMessage(Handler.java:104) 
        at android.os.Looper.loop(Looper.java:207) 
        at android.app.ActivityThread.main(ActivityThread.java:5845) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:768) 
        Suppressed: java.lang.ClassNotFoundException: javax.xml.stream.XMLEventFactory
        at java.lang.Class.classForName(Native Method)
        at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
        at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
                ... 20 more
     Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
Answer 1

Попробуйте для xlsx применить HSSFWorkbook

Workbook wb;
if (file.endWith(.xlsx))wb=new HSSFWorkbook();
else if (file.endWith(.xls))wb=new XSSFWorkbook();
Answer 2

В итоге все оказалось хоть и запутано, но не так сложно. Как я понял проблема связана с тем, что Apache POI полностью совместим с android только в версии 3.17, когда другие версии работаю частично. Вот мое решение: Сначала в gradle(allproject) добавляем:

buildscript {
    ...
    ext {
        poiVersion = '3.17'
    }
    ...
 }
allprojects {
    repositories {
        jcenter()
        google()
        maven { url 'https://jitpack.io' }
    }
}

После надо добавить в dependencies из файла build.gradle:

implementation "com.github.SUPERCILEX.poi-android:poi:$poiVersion"

Вот на всякий случай мой полный Build.gradle:

apply plugin: 'com.android.application'
android {
    compileSdkVersion 28
    buildToolsVersion "28.0.3"
    //useLibrary 'org.apache.http.legacy'
    defaultConfig {
        multiDexEnabled true  // this line will solve this problem
        applicationId "com.example.jone1.navigation_drawer"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    configurations.all {
        resolutionStrategy {
            force 'com.android.support:support-v4:27.1.0'
        }
    }
    buildTypes {
        release {
            multiDexKeepFile file('multidex-config.txt')
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

}
dependencies {
    implementation "com.github.SUPERCILEX.poi-android:poi:$poiVersion"
    ...
    }
READ ALSO
Spring @Controller + BeanPostProcessor with proxy

Spring @Controller + BeanPostProcessor with proxy

Похожие вопросы, но ответов на них так и не последовало, возможно сейчас сюда забредет гуру спринга и разложит все по полочкам: тыц и тыц

180
Проблема с парсингом сайта с помощью Jsoup

Проблема с парсингом сайта с помощью Jsoup

Несколько дней назад сайт перевели на https, и сайт перестал парситьсяДругие https сайты парсятся без проблем

94
failed to load applicationcontext в тестах DAO слоя

failed to load applicationcontext в тестах DAO слоя

Суть проблемы: пишу тесты для дао слоя и не при запуске вылазит ошибка failed to load applicationcontextПомогите, кто знает в чем проблема

103
Перестали отрываться jar-файлы ubuntu

Перестали отрываться jar-файлы ubuntu

Раньше по двойному клику открывалось gui приложение на OpenJDK Java 8 Policy ToolНе знаю что случилось, но стало запускаться только из консоли

69