使用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组件加载失败引发的连锁错误。
修复步骤
- 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>
- Gradle项目:在
build.gradle中添加
implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.2'
- 重新构建项目,确保依赖下载完成后再运行代码。
额外优化建议
- 调用
getBlobClient时,参数应为Blob在容器中的名称(比如直接传myJpgFile),而非本地文件路径+文件名,否则会将本地路径作为Blob的层级结构上传,可能不符合预期。 - 上传大文件时,可使用
uploadFromFile的重载方法设置分块大小,提升上传效率。
内容的提问来源于stack exchange,提问作者Ommadawn
相关产品推荐
相关产品推荐

