#java #azure #azure-blob-storage
#java #azure #azure-blob-хранилище
Вопрос:
Я столкнулся с ошибкой при попытке создать Azure blobConatinerClient, используя имеющиеся у меня учетные данные.
учетные данные — это instanceOf StorageSharedKeyCredential, а конечная точка — instanceOf String
Это и есть код
public BlobContainerClient initBlobClient() {
BlobContainerClient blobContainerClient;
StorageSharedKeyCredential credential = new StorageSharedKeyCredential(ACCOUNT_NAME, ACCOUNT_KEY);
String endpoint = String.format(Locale.ROOT, "https://test.blob.core.windows.net");
// Getting the ClassDefError here
BlobServiceClient storageClient = new BlobServiceClientBuilder().endpoint(endpoint).credential(credential).buildClient();
blobContainerClient = storageClient.getBlobContainerClient(CONTAINTER_NAME);
return blobContainerClient;
}
и это трассировка стека, которую это вызывает
at com.fasterxml.jackson.dataformat.xml.XmlMapper.<init>(XmlMapper.java:122)
at com.azure.core.util.serializer.JacksonAdapter.<init>(JacksonAdapter.java:76)
at com.azure.core.util.serializer.JacksonAdapter.createDefaultSerializerAdapter(JacksonAdapter.java:109)
at com.azure.core.http.rest.RestProxy.createDefaultSerializer(RestProxy.java:615)
at com.azure.core.http.rest.RestProxy.create(RestProxy.java:667)
at com.azure.storage.blob.implementation.ServicesImpl.<init>(ServicesImpl.java:58)
at com.azure.storage.blob.implementation.AzureBlobStorageImpl.<init>(AzureBlobStorageImpl.java:216)
at com.azure.storage.blob.implementation.AzureBlobStorageBuilder.build(AzureBlobStorageBuilder.java:93)
at com.azure.storage.blob.BlobServiceAsyncClient.<init>(BlobServiceAsyncClient.java:108)
at com.azure.storage.blob.BlobServiceClientBuilder.buildAsyncClient(BlobServiceClientBuilder.java:109)
at com.azure.storage.blob.BlobServiceClientBuilder.buildClient(BlobServiceClientBuilder.java:82)
И это зависимости Azure, которые у меня есть. Я также добавил Джексона, поскольку в одном из комментариев StackOverflow говорилось, что это решит проблему, но это не так.
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.azure/azure-storage-blob -->
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-storage-blob</artifactId>
<version>12.9.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.azure/azure-core -->
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-core</artifactId>
<version>1.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.projectreactor/reactor-core -->
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
<version>3.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-storage</artifactId>
<version>8.6.3</version>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure</artifactId>
<version>1.33.0</version>
</dependency>
Может кто-нибудь указать, если чего-то не хватает, или мне нужно что-то изменить здесь?
Ответ №1:
azure-storage-blob
Для Azure Storage Blob SDK требуется только зависимость от.
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-storage-blob</artifactId>
<version>12.9.0</version>
</dependency>
А вот и пример создания контейнера.
// From the Azure portal, get your Storage account's name and account key.
String accountName = "";
String accountKey = "";
// Use your Storage account's name and key to create a credential object; this is used to access your account.
StorageSharedKeyCredential credential = new StorageSharedKeyCredential(accountName, accountKey);
// From the Azure portal, get your Storage account blob service URL endpoint.
// The URL typically looks like this:
String endpoint = String.format(Locale.ROOT, "https://%s.blob.core.windows.net", accountName);
// Create a BlobServiceClient object that wraps the service endpoint, credential and a request pipeline.
BlobServiceClient storageClient = new BlobServiceClientBuilder().endpoint(endpoint).credential(credential).buildClient();
// Create the container and return a container client object
BlobContainerClient containerClient = blobServiceClient.createBlobContainer(containerName);
Пожалуйста, попробуйте следовать этому быстрому началу, чтобы создать проект maven.
Комментарии:
1. Привет, @Дипак Гопал. Вы пытались создать Azure BlobConatinerClient с образцом? Полезен ли мой ответ?
2. Привет @Памела Пэн, спасибо за ответ. Я ссылался на руководство по быстрому запуску Azure для подключения к BlobServiceClient, но я все равно получаю
NoClassDefError
3. Не могли бы вы поделиться дополнительным кодом? Я не могу воспроизвести ошибку с помощью just
BlobServiceClient storageClient = new BlobServiceClientBuilder().endpoint(endpoint).credential(credential).buildClient();
.4. Я обновил код в вопросе. Он в основном такой же, как тот, который вы скопировали в своем ответе.
Ответ №2:
Я столкнулся с той же проблемой в clojure, которая также использует библиотеку Java Azure. В моем случае были некоторые другие библиотеки, которые мы использовали, которые имели зависимость от jackson fasterxml. azure-storage-blob также использует ту же зависимость с другой версией.
Для нас среди тех, кто добавил более высокую версию jason fasterxml dependency в dependencies, наша проблема была решена.
Сначала вы можете найти все дерево зависимостей, затем, анализируя дерево, вы можете найти наиболее обновленную версию jason fasterxml.
Приведенные ниже зависимости работали для нас
[com.azure/azure-storage-blob "12.14.3"]
[com.fasterxml.jackson.core/jackson-databind "2.13.1"]
[com.fasterxml.jackson.core/jackson-core "2.13.1"]]
Вы можете найти более подробную информацию здесь