Apache jclouds — ошибка загрузчика службы при использовании в AndroidAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Apache jclouds — ошибка загрузчика службы при использовании в Android

Сообщение Anonymous »

Я пытаюсь использовать набор инструментов Apache jclouds (https://jclouds.apache.org/) для загрузки файлов в хранилище AWS или Azure. В частности, я хочу сделать это в приложении для Android.
Я использую Android Studio IDE для разработки, использую Gradle для сборки и пишу все на Kotlin.
jclouds работает абсолютно нормально, когда я просто запускаю скрипт main() из IDE. Я могу нормально загружать файлы в Azure или AWS. Минимальный пример (на Kotlin), который не загружается, но иллюстрирует проблему:
import org.jclouds.providers.Providers

fun main() {
println(Providers.all().map{it.id}.toSet())
}

>> [aws-s3, azureblob, b2, google-cloud-storage, rackspace-cloudfiles-us, rackspace-cloudfiles-uk]

в котором просто перечислены все поставщики облачных услуг, которые поддерживает jcloud.
Когда я пытаюсь запустить тот же код из своего приложения, у меня возникают проблемы. Во-первых, сборка APK завершается неудачно из-за нескольких/повторяющихся путей META-INF/DEPENDENCIES:
Execution failed for task ':app:mergeDebugJavaResource'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.MergeJavaResWorkAction
> 21 files found with path 'META-INF/DEPENDENCIES' from inputs:
- /Users/senparsons/.gradle/caches/transforms-3/3a6b0c849edb2a98ffcd0988e9962ed2/transformed/jetified-jclouds-allblobstore-2.6.0.jar
- /Users/senparsons/.gradle/caches/transforms-3/f66b159f397ffa685234aaf7f817ecf2/transformed/jetified-aws-s3-2.6.0.jar
- /Users/senparsons/.gradle/caches/transforms-3/16dd5496f82c90f4c1357b5d6d3fca4e/transformed/jetified-s3-2.6.0.jar

[.... etc]


Когда я исправлю это в файле build.gradle моего приложения с помощью:
packagingOptions {
pickFirst 'META-INF/AL2.0'
pickFirst 'META-INF/LGPL2.1'
// required to allow to build with jcloud (due to jetified-xxx dependencies):
merge 'META-INF/DEPENDENCIES*'
merge 'META-INF/LICENSE.md'
merge 'META-INF/NOTICE.md'
}

приложение собирается, но когда я вызываю приложение,
Providers.all().map{it.id}.toSet()

Я получаю исключение:
java.util.ServiceConfigurationError: org.jclouds.providers.ProviderMetadata: Provider org.jclouds.aws.s3.AWSS3ProviderMetadata could not be instantiated
at java.util.ServiceLoader.fail(ServiceLoader.java:233)
at java.util.ServiceLoader.access$100(ServiceLoader.java:183)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:392)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:416)
at java.util.ServiceLoader$1.next(ServiceLoader.java:494)
at com.google.common.collect.ImmutableCollection$Builder.addAll(ImmutableCollection.java:433)
at com.google.common.collect.ImmutableCollection$ArrayBasedBuilder.addAll(ImmutableCollection.java:538)
at com.google.common.collect.ImmutableSet$Builder.addAll(ImmutableSet.java:527)
at org.jclouds.providers.Providers.all(Providers.java:83)

[... etc ....]

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)
Caused by: java.lang.ExceptionInInitializerError
at org.jclouds.JcloudsVersion.get(JcloudsVersion.java:153)
E/AndroidRuntime: at org.jclouds.apis.internal.BaseApiMetadata.defaultProperties(BaseApiMetadata.java:84)
at org.jclouds.apis.internal.BaseApiMetadata$Builder.(BaseApiMetadata.java:111)
at org.jclouds.rest.internal.BaseHttpApiMetadata$Builder.(BaseHttpApiMetadata.java:77)
at org.jclouds.s3.S3ApiMetadata$Builder.(S3ApiMetadata.java:100)
at org.jclouds.aws.s3.AWSS3ApiMetadata$Builder.(AWSS3ApiMetadata.java:60)
at org.jclouds.aws.s3.AWSS3ApiMetadata.(AWSS3ApiMetadata.java:44)
at org.jclouds.aws.s3.AWSS3ProviderMetadata$Builder.(AWSS3ProviderMetadata.java:113)
at org.jclouds.aws.s3.AWSS3ProviderMetadata.builder(AWSS3ProviderMetadata.java:59)
at org.jclouds.aws.s3.AWSS3ProviderMetadata.(AWSS3ProviderMetadata.java:68)
at java.lang.Class.newInstance(Native Method)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:388)
... 42 more
Caused by: java.lang.NullPointerException: META-INF/maven/org.apache.jclouds/jclouds-core/pom.properties
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:907)
at org.jclouds.JcloudsVersion.readVersionPropertyFromClasspath(JcloudsVersion.java:87)
at org.jclouds.JcloudsVersion.(JcloudsVersion.java:82)
at org.jclouds.JcloudsVersion.(JcloudsVersion.java:77)
at org.jclouds.JcloudsVersion.(JcloudsVersion.java:48)
... 54 more

Насколько я понимаю, jclouds использует «загрузчики сервисов» Java для загрузки классов «метаданных» для каждого поставщика (AWS, Azure и т. д.). т. е. загрузчик службы загружает класс метаданных (например, org.jclouds.aws.s3.AWSS3ProviderMetadata), который реализует интерфейс org.jclouds.providers.ProviderMetadata. Поскольку этот класс метаданных должен делать все, что связано с его провайдером (включая загрузку в хранилище), это не просто проблема получения списка строк провайдера.
Итак, что же является причиной службы? проблема с загрузчиком? Куда делись мои классы метаданных? Это связано с файлами META-INF/DEPENDENCIES? Насколько я понимаю, пользовательские файлы загрузчиков служб находятся в META-INF/SERVICES. Ближайший похожий пост, который я смог найти, — это Jclouds с несколькими провайдерами, но это мне мало чем помогло, кроме выявления проблемы.
Буду очень признателен за любую помощь. Спасибо.
К вашему сведению, мой единственный импорт jclouds (в ​​build.gradle):
implementation 'org.apache.jclouds:jclouds-allblobstore:2.6.0'


Подробнее здесь: https://stackoverflow.com/questions/784 ... in-android
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»