You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Azure Java SDK上传JPG至Blob容器失败,客户端构建报错

问题描述

尝试使用Azure Java SDK编写Java代码,将本地JPG文件上传至Azure Blob容器,编写了两种实现方式,但均在构建客户端阶段失败。

第一种代码实现

String ENDPOINT= "https://myaccount.blob.core.windows.net";

BlobContainerClient blobContainerClient = new BlobContainerClientBuilder().
    endpoint(ENDPOINT).
    credential(CREDENTIAL).
    containerName(CONTAINER_NAME).
    buildClient();

// 获取本地图片的引用
BlobClient blobClient = blobContainerClient.getBlobClient(myJpgLocalPath + myJpgFile);

// 设置请求头
blobClient.setHttpHeaders(new BlobHttpHeaders().setContentType("image/jpeg"));

// 上传Blob
blobClient.uploadFromFile(myJpgLocalPath + myJpgFile, false);

第二种代码实现

BlobServiceClient storageClient = new BlobServiceClientBuilder().
    endpoint(ENDPOINT).
    credential(CREDENTIAL).
    buildClient();

BlobContainerClient blobContainerClient = storageClient.getBlobContainerClient(CONTAINER_NAME); 

// 获取本地图片的引用
BlobClient blobClient = blobContainerClient.getBlobClient(myJpgLocalPath + myJpgFile);
    
// 设置请求头
blobClient.setHttpHeaders(new BlobHttpHeaders().setContentType("image/jpeg"));
    
// 上传Blob
blobClient.uploadFromFile(myJpgLocalPath + myJpgFile, false);

报错信息

java.lang.ClassNotFoundException: com.fasterxml.jackson.dataformat.xml.PackageVersion
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1412)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1220)
        at com.azure.core.implementation.jackson.JacksonVersion.<init>(JacksonVersion.java:46)
        at com.azure.core.implementation.jackson.JacksonVersion.getInstance(JacksonVersion.java:72)
        at com.azure.core.implementation.jackson.ObjectMapperShim.<clinit>(ObjectMapperShim.java:40)
        at com.azure.core.util.serializer.JacksonAdapter.<init>(JacksonAdapter.java:81)
        at com.azure.core.util.serializer.JacksonAdapter.<init>(JacksonAdapter.java:59)
        at com.azure.core.util.serializer.JacksonAdapter$SerializerAdapterHolder.<clinit>(JacksonAdapter.java:114)
        at com.azure.core.util.serializer.JacksonAdapter.createDefaultSerializerAdapter(JacksonAdapter.java:123)
        at com.azure.storage.blob.implementation.util.ModelHelper.<clinit>(ModelHelper.java:62)
        at com.azure.storage.blob.BlobUrlParts.parse(BlobUrlParts.java:371)
        at com.azure.storage.blob.BlobContainerClientBuilder.endpoint(BlobContainerClientBuilder.java:181)
...

java.lang.NoClassDefFoundError: Could not initialize class com.azure.storage.blob.implementation.util.ModelHelper
        at com.azure.storage.blob.BlobUrlParts.parse(BlobUrlParts.java:371)
        at com.azure.storage.blob.BlobContainerClientBuilder.endpoint(BlobContainerClientBuilder.java:181)
...
解决方案

这是依赖缺失导致的问题,和代码逻辑无关:

  • 报错中的com.fasterxml.jackson.dataformat.xml.PackageVersion属于Jackson XML处理包,Azure SDK核心组件依赖该包完成XML序列化/反序列化操作,你的项目未引入此依赖,导致类加载失败。
  • 后续的NoClassDefFoundError是ModelHelper初始化时依赖的Jackson组件加载失败引发的连锁错误。

修复步骤

  1. Maven项目:在pom.xml中添加以下依赖
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.15.2</version> <!-- 版本建议与Azure SDK依赖的Jackson版本保持一致,可通过maven依赖树查看 -->
</dependency>
  1. Gradle项目:在build.gradle中添加
implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.2'
  1. 重新构建项目,确保依赖下载完成后再运行代码。

额外优化建议

  • 调用getBlobClient时,参数应为Blob在容器中的名称(比如直接传myJpgFile),而非本地文件路径+文件名,否则会将本地路径作为Blob的层级结构上传,可能不符合预期。
  • 上传大文件时,可使用uploadFromFile的重载方法设置分块大小,提升上传效率。

内容的提问来源于stack exchange,提问作者Ommadawn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 17:40:40