2015-06-21 4 views
3

Чтобы получить POI Apache для работы на Android, мне нужно заставить Stack работать на Android. Следуя этому вопросу: Using JAXB with Google Android и ответ @Sean Barbeau. Я успешно преобразовал все для Android совместимых, фляги в том числе библиотеки Apache POI, но она по-прежнему дает мне это время выполнения ошибку:Использование пакета com.bea.xml.stream на android

06-22 01:06:52.461 14865-14865/com.quizwiz.sharmakritya.poi E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.quizwiz.sharmakritya.poi, PID: 14865 
    edu.usf.cutr.javax.xml.stream.FactoryConfigurationError: Provider com.bea.xml.stream.EventFactory not found 
      at edu.usf.cutr.javax.xml.stream.FactoryFinder.newInstance(FactoryFinder.java:72) 
      at edu.usf.cutr.javax.xml.stream.FactoryFinder.find(FactoryFinder.java:176) 
      at edu.usf.cutr.javax.xml.stream.FactoryFinder.find(FactoryFinder.java:92) 
      at edu.usf.cutr.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:162) 
      at org.apache.poi.openxml4j.opc.OPCPackage.<init>(OPCPackage.java:142) 
      at org.apache.poi.openxml4j.opc.Package.<init>(Package.java:37) 
      at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:87) 
      at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:273) 
      at org.apache.poi.xslf.usermodel.XMLSlideShow.empty(XMLSlideShow.java:103) 
      at org.apache.poi.xslf.usermodel.XMLSlideShow.<init>(XMLSlideShow.java:75) 
      at com.quizwiz.sharmakritya.poi.PPT.onCreate(PPT.java:16) 
      at android.app.Activity.performCreate(Activity.java:5451) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2377) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471) 
      at android.app.ActivityThread.access$900(ActivityThread.java:175) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:146) 
      at android.app.ActivityThread.main(ActivityThread.java:5602) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
      at dalvik.system.NativeStart.main(Native Method) 

Суть всей ошибка является андроид отсутствует пакет com.bea.xml.stream. Как это разрешить?

Я попытался решить это самостоятельно, загрузив внешнюю банку с here. Но это дало мне странные ошибки:

06-22 01:10:42.906 20374-20374/com.quizwiz.sharmakritya.poi E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.quizwiz.sharmakritya.poi, PID: 20374 
    java.lang.RuntimeException: Unable to instantiate application android.support.multidex.MultiDexApplication: java.lang.RuntimeException: Multi dex installation failed (Field dexElementsSuppressedExceptions not found in class dalvik.system.PathClassLoader). 
      at android.app.LoadedApk.makeApplication(LoadedApk.java:516) 
      at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4703) 
      at android.app.ActivityThread.access$1600(ActivityThread.java:175) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1368) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:146) 
      at android.app.ActivityThread.main(ActivityThread.java:5602) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.RuntimeException: Multi dex installation failed (Field dexElementsSuppressedExceptions not found in class dalvik.system.PathClassLoader). 
      at android.support.multidex.MultiDex.install(MultiDex.java:178) 
      at android.support.multidex.MultiDexApplication.attachBaseContext(MultiDexApplication.java:39) 
      at android.app.Application.attach(Application.java:201) 
      at android.app.Instrumentation.newApplication(Instrumentation.java:997) 
      at android.app.Instrumentation.newApplication(Instrumentation.java:981) 
      at android.app.LoadedApk.makeApplication(LoadedApk.java:511) 
            at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4703) 
            at android.app.ActivityThread.access$1600(ActivityThread.java:175) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1368) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:146) 
            at android.app.ActivityThread.main(ActivityThread.java:5602) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:515) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
            at dalvik.system.NativeStart.main(Native Method) 

Примечания: удаления com.bea.stax.impl_1.2.0.jar из Gradle зависимостей заставляет меня вернуться к первой ошибке.

Пожалуйста, помогите мне найти способ использования пакета com.bea.xml.stream для android. UPDATE

Зависимости до вашего ответа в Gradle:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    packagingOptions{ 
     exclude 'META-INF/DEPENDENCIES' 
     exclude 'META-INF/NOTICE' 
     exclude 'META-INF/NOTICE.txt' 
     exclude 'META-INF/LICENSE' 
     exclude 'META-INF/LICENSE.txt' 
    } 

    defaultConfig { 
     applicationId "com.quizwiz.sharmakritya.poi" 
     minSdkVersion 16 
     targetSdkVersion 21 
     versionCode 1 
     versionName "1.0" 
     multiDexEnabled true 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 
dependencies { 
    compile 'com.android.support:appcompat-v7:21.0.3' 
    compile 'com.android.support:multidex:1.0.0' 
    compile files('libs/stax-api-android-1.0-2.jar') 
    compile files('libs/stax2-api-android-3.1.1.jar') 
    //compile files('libs/com.bea.stax.impl_1.2.0.jar') 
    compile files('libs/poi-3.12-20150511.jar') 
    compile files('libs/poi-ooxml-3.12-20150511.jar') 
    compile files('libs/poi-ooxml-schemas-3.12-20150511.jar'){ 
    exclude group: 'stax', module: 'stax-api' 
    } 
    compile files('libs/xmlbeans-2.6.0.jar') 
    compile files('libs/stax-1.2.0_rc2-dev.jar') 
} 

UPDATE # 2 ошибка во время компиляции я получаю:

Error:duplicate files during packaging of APK C:\Users\sharmakritya\AndroidStudioProjects\POI\app\build\outputs\apk\app-debug-unaligned.apk 
    Path in archive: META-INF/services/javax.xml.stream.XMLInputFactory 
    Origin 1: C:\Users\sharmakritya\AndroidStudioProjects\POI\app\build\intermediates\javaResources\debug\META-INF\services\javax.xml.stream.XMLInputFactory 
    Origin 2: C:\Users\sharmakritya\.gradle\caches\modules-2\files-2.1\edu.usf.cutr.android.xml\aalto-xml-android\0.9.8\bf4e7339b028f92638b36ab9ac3cc3314a860d1\aalto-xml-android-0.9.8.jar 
You can ignore those files in your build.gradle: 
    android { 
     packagingOptions { 
     exclude 'META-INF/services/javax.xml.stream.XMLInputFactory' 
     } 
    } 
Error:Execution failed for task ':app:packageDebug'. 
> Duplicate files copied in APK META-INF/services/javax.xml.stream.XMLInputFactory 
    File 1: C:\Users\sharmakritya\AndroidStudioProjects\POI\app\build\intermediates\javaResources\debug\META-INF\services\javax.xml.stream.XMLInputFactory 
    File 2: C:\Users\sharmakritya\AndroidStudioProjects\POI\app\build\intermediates\javaResources\debug\META-INF\services\javax.xml.stream.XMLInputFactory 
+0

На самом деле - вы пытались переупаковка POI в новый JAR, с тем же именем класса свопа, как вы использовали в Stax/Аалто JAR-файлы? Просто заметили, что они не изменяются (т. Е. Являются JAR рабочего стола) в ваших зависимостях. –

+0

Нет, я тоже модифицировал POI. Я просто не помещал тег android, поскольку имена становились слишком большими. PS: Удостоверьтесь, что это дамп от edu.usf.cutr.javax.xml.stream, и я действительно дошел до этой цели только для этого решения. – kritya

+0

Gotcha - хорошо, поэтому мои другие предложения в моем отредактированном ответе ниже. Дайте мне знать, если вы это выясните! –

ответ

4

Проверить FAQ #18:

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.

...

Возможно, вам необходимо исключить зависимость stax:stax-api через используемую систему сборки. Я просто решил аналогичную проблему (такую ​​же трассировку стека, но из Groovy), применяя этот метод.

UPDATE: Лучше всего, если вы используете зависимости из репозитория Maven, он будет в значительной степени упростить зависимости раздел:

dependencies { 
    compile 'com.android.support:appcompat-v7:21.0.3' 
    compile 'com.android.support:multidex:1.0.0' 
    compile ('org.apache.poi:poi-ooxml:3.12') { 
     exclude group: 'stax', module: 'stax-api' 
    } 
} 

Вы можете теперь удалить дополнительные библиотеки, которые у вас есть под libs.

Справку ответ Apache POI показывает, что StAX может быть не нужен вообще для некоторых версий Java, особенно выше 6.

+0

Вы имеете в виду, что я могу исключить stax api и включить его реализацию? Примечание. Я использую это на Android. Извините, если вы знаете это уже, но. Android не имеет погоды Stack Api, которую вы запускаете на Java 5 или 6. – kritya

+0

Проверьте обновление для зависимостей, которые я использую в своем проекте gradle. И не могли бы вы сказать мне, какие из них вы сохранили, а какие вы удалили. Спасибо – kritya

+0

Да, я прочитал POI faq и особенно этот вопрос. Но мне нужно прикрепить его, поскольку андроид намеренно не включает в себя пакет потока. Поэтому мне нужно приложить дополнительные баночки для этого только. – kritya

3

Попробуйте использовать расфасованные JARs из репо CUTR Maven для StAX и Аалто:

apply plugin: 'com.android.application' 

repositories { 
    mavenCentral() 
    maven { 
     // CUTR SNAPSHOTs 
     url "https://github.com/CUTR-at-USF/cutr-mvn-repo/raw/master/snapshots" 
    } 
    maven { 
     // CUTR Releases 
     url "https://github.com/CUTR-at-USF/cutr-mvn-repo/raw/master/releases" 
    } 
} 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    packagingOptions{ 
     // exclude 'META-INF/DEPENDENCIES' <--- and try commenting this out, I don't believe it should be needed 
     exclude 'META-INF/NOTICE' 
     exclude 'META-INF/NOTICE.txt' 
     exclude 'META-INF/LICENSE' 
     exclude 'META-INF/LICENSE.txt' 
     pickFirst 'META-INF/services/javax.xml.stream.XMLInputFactory' 
    } 

    defaultConfig { 
     applicationId "com.quizwiz.sharmakritya.poi" 
     minSdkVersion 16 
     targetSdkVersion 21 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 
dependencies { 
    compile 'com.android.support:appcompat-v7:21.0.3' 
    compile files('libs/poi-3.12-20150511.jar') 
    compile files('libs/poi-ooxml-3.12-20150511.jar') 
    compile files('libs/poi-ooxml-schemas-3.12-20150511.jar'){ 
    compile files('libs/xmlbeans-2.6.0.jar') 
    // JSR173 APIs 
    compile 'edu.usf.cutr.android.xml:stax2-api-android:3.1.1' 
    compile 'edu.usf.cutr.android.xml:stax-api-android:1.0-2' 
    // JSR173 provider implementation - Aalto 
    compile 'edu.usf.cutr.android.xml:aalto-xml-android:0.9.8' 
} 

Я считаю, что главная проблема в том, что Apache POI зависит от JSR173 Streaming API for XML, которая зависит от платформы (в нашем случае Android) в состоянии обеспечить реализацию и основной поставщик XML синтаксический анализ. Android не поддерживает JSR173, поэтому он не может найти поставщика - com.bea.xml.stream.EventFactory является поставщиком по умолчанию, и он даже не может найти его (см. JAXB marshalling exception javax.xml.stream.FactoryConfigurationError running with Java 5 для получения более подробной информации по этой теме).

Aalto является поставщиком JSR173 с открытым исходным кодом, поэтому вы можете использовать это вместо реализации BEA (com.bea.xml.stream.EventFactory).Архив Aalto (файл JAR) включает в себя необходимую регистрацию (под файлом META-INF/services/javax.xml.stream.XMLInputFactory, который указывает на класс Aalto com.fasterxml.aalto.stax.InputFactoryImpl), который должен позволить платформе Java распознавать ее как реализацию JSR173. В результате вы больше не должны получать ошибку edu.usf.cutr.javax.xml.stream.FactoryConfigurationError: Provider com.bea.xml.stream.EventFactory not found, потому что Android должен признать, что Aalto - это доступный провайдер, и вместо этого использовать Aalto.

Примечание - очевидно there are bugs с предыдущими версиями ADT для плагина Eclipse и Gradle < 0.7.0, который разбивает файлы из JAR в процессе сборки. Похоже, что> = v0.7.0 не должно быть проблем в соответствии с Google, но из отчетов других кажется, что все еще может быть проблематично, и потенциально может удалить файл META-INF/services/javax.xml.stream.XMLInputFactory, который необходим для регистрации платформы Aalto.

Если выше не работает, попробуйте обходной путь, упомянутый в AOSP issue 59658 comment 22:

  1. right click on /src/main (where you have /java and /res folders),
  2. select New > Folder > Java Resources Folder,
  3. click Finish (do not change Folder Location),
  4. right click on new /resources folder,
  5. select New > Directory
  6. enter "META-INF" (without quotes),
  7. right click on /resources/META-INF folder,
  8. select New > Directory
  9. enter "services" (without quotes)
  10. copy any file you need into /resources/META-INF/services

Для вас, на шаге 10 выше вам нужно скопировать this file (javax.xml.stream.XMLInputFactory) в /resources/META-INF/services.

Если вышеуказанное не работает, я также заметил, что у вас есть exclude 'META-INF/DEPENDENCIES' в вашей упаковкеОпции - я бы удалил это, так как я не считаю, что вам нужна эта строка, и это может вызвать проблемы с регистрацией Аалто тоже.

Вы также можете проверить некоторые другие решения/работы, которые люди сделали пытаются получить Apache POI работает на Android:

+0

Извините, может быть, я не получу то, что должен делать. Потому что я не знаю, как переупаковать FasterXML в требуемой форме. Я попробовал добавить alto-xml-jar-0.9.6.jar с сайта woodstox. И он все еще говорит, что реализация не найдена. Так что, пожалуйста, помогите мне в том, что мне нужно сделать. – kritya

+0

Извините, я не был чист. Я просто изменил ответ выше - вам нужно обработать файл JAR aalto-xml, чтобы изменить пространство имен, так же, как вы делали это с JAR-файлами stax, и добавить его в свои зависимости. Я надеялся, что aalto зарегистрируется, но теперь я понимаю, что вы не используете Джексона, и все разборки происходит в библиотеке POI Apache. Таким образом, я не уверен, что это сработает (потому что Apache POI не обязательно знает об Aalto, упакованном с приложением). Но, стоит попробовать. –

+0

Я попытался переупаковать aalto-xml так, как вы сказали. Тем не менее такая же ошибка провайдера не найдена. Ошибка генерируется в javax.xml.stream. *, А не в POI. Поэтому я предполагаю, что ошибка не должна лежать в конце POI или не должна зависеть от нее. Кроме того, извините, если я говорю глупо. Но alto-xml не содержит никакого пакета как com.bea. *, Который действительно необходим stax api. Исправьте меня, если это не сработает. Спасибо – kritya

1

После обновления POI от 3,9 до 3,15 мы получали:

javax.xml.stream.FactoryConfigurationError: Provider for class javax.xml.stream.XMLEventFactory cannot be created 

Кроме POI, наша сборка включена:

compile ('com.msopentech.odatajclient:odatajclient-engine:0.9.0') 

оказался, что odatajclient банки включили java.xml.stream.XMLEventFactory файл в META-INF\services, тем содержать этот файл был com.fasterxml.aalto.stax.EventFactoryImpl но Аалто включен в odatajclient была стар и com.fasterxml.aalto.stax.EventFactoryImpl окончательно наследовал от com.msopentech.javax.xml.stream.XMLEventFactory вместо java.xml.stream.XMLEventFactory класс.

Во время эксплуатации POI использовал java.xml.stream.XMLEventFactory, загрузчик классов возвратил com.fasterxml.aalto.stax.EventFactoryImpl, а литой - java.xml.stream.XMLEventFactory.

Раствор исключая модуль, который включал старый Аалто:

compile ('com.msopentech.odatajclient:odatajclient-engine:0.9.0') 
{ 
    exclude group: 'com.msopentech.odatajclient', module: 'odatajclient-engine-xml' 
} 
+0

Спасибо за ответ, вы протестировали это? Если да, то на каком Android API? – kritya

+0

Да, я протестировал его. Мне удалось запустить из Eclipse, но не из файла jar, созданного Gradle. Как только мы удалили зависимость в build.gradle, нам удалось запустить из файла jar. – Sebastian

+0

Я не работаю на Android, я работаю на ПК, Java 1.8. Я хотел бы указать, что во время выполнения это была зависимость XMLEventFactory от причины проблемы. – Sebastian