
本文详解 Maven 项目中因 software.amazon.awssdk.auth.credentials 包无法解析而导致 OSGi Bundle 启动失败的问题,核心在于错误使用 provided 导致运行时类缺失,并提供完整、可落地的依赖配置与最佳实践。
本文详解 maven 项目中因 `software.amazon.awssdk.auth.credentials` 包无法解析而导致 osgi bundle 启动失败的问题,核心在于错误使用 `
在基于 OSGi 的环境(如 Adobe Experience Manager/AEM)中集成 AWS SDK for Java 2.x 时,常见报错如下:
Unresolved requirements: [[aem-myproject.core [622]] osgi.wiring.package; (osgi.wiring.package=software.amazon.awssdk.auth.credentials)]
该错误表明:OSGi 容器在解析 Bundle 依赖时,未能在运行时类路径中找到 software.amazon.awssdk.auth.credentials 所在的包——这通常并非缺少某个“隐藏”模块,而是由 Maven 依赖作用域(
? 根本原因:provided> 的误用
您在 pom.xml 中为 aws-sdk-java 声明了:
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>aws-sdk-java</artifactId>
<version>2.20.2</version>
<scope>provided</scope> <!-- ❌ 问题根源 -->
</dependency>✅ 正确做法:显式声明所需模块,并统一使用 compile 作用域(默认可省略),确保所有必要类随 Bundle 一同部署。
✅ 推荐依赖配置(精简、合规、可运行)
AWS SDK v2 采用模块化设计,切勿引入 aws-sdk-java(v1 兼容聚合包,v2 中已弃用且不含实际功能)。应按需引入最小必要模块:
<!-- SNS 核心客户端 -->
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>sns</artifactId>
<version>2.20.2</version>
</dependency>
<!-- 认证支持(含 CredentialsProvider 等) -->
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>auth</artifactId>
<version>2.20.2</version>
</dependency>
<!-- (可选)区域与配置工具 -->
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>regions</artifactId>
<version>2.20.2</version>
</dependency>✅ 说明:
- 所有依赖均省略
(等价于 compile),确保被包含在 Bundle 中; - sns 模块已自动传递依赖 auth 和 regions,但显式声明可提升可读性与版本可控性;
- 避免 aws-sdk-java(v1 聚合包)或 core(低层抽象,不建议直接引用)。
? 验证代码示例(SNS Topic 创建)
配置生效后,以下代码可正常编译并运行于 AEM OSGi 环境:
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;
import software.amazon.awssdk.services.sns.model.CreateTopicRequest;
import software.amazon.awssdk.services.sns.model.CreateTopicResponse;
public class SnsService {
public String createTopic(String topicName) {
SnsClient snsClient = SnsClient.builder()
.region(Region.US_EAST_1)
.credentialsProvider(DefaultCredentialsProvider.create())
.build();
CreateTopicRequest request = CreateTopicRequest.builder()
.name(topicName)
.build();
CreateTopicResponse response = snsClient.createTopic(request);
return response.topicArn();
}
}⚠️ 关键注意事项
- 禁止混合 SDK 版本:确保所有 software.amazon.awssdk.* 依赖使用完全一致的版本号(如 2.20.2),避免因 API 不兼容导致 NoSuchMethodError;
- AEM 特定限制:AEM 6.5+ 内置较旧的 Jackson 版本,若遇到 JSON 解析冲突,可考虑使用 bom 管理依赖(见下文);
- 生产环境凭证安全:DefaultCredentialsProvider 依赖 EC2 实例角色、环境变量或 ~/.aws/credentials,切勿在代码中硬编码 Access Key;AEM 中推荐使用 AEM Cloud Service 集成 或 Vault 配置;
- Bundle 导出包(高级):若需被其他 Bundle 使用,确保 maven-bundle-plugin 正确导出 software.amazon.awssdk.* 包(AEM 默认已处理,一般无需干预)。
? 进阶建议:使用 BOM 统一管理(推荐)
为彻底规避版本碎片化风险,强烈推荐通过 aws-sdk-java-v2-bom 声明依赖:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>2.20.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>sns</artifactId>
<!-- 无需指定 version,BOM 已统一 -->
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>auth</artifactId>
</dependency>
</dependencies>✅ 总结
| 问题现象 | osgi.wiring.package=software.amazon.awssdk.auth.credentials 未解析 |
|---|---|
| 根本原因 | 错误使用 |
| 解决方案 | 移除 provided,改用 compile(默认),并仅引入 sns + auth 等必要模块 |
| 最佳实践 | 使用 bom 管理版本、避免 aws-sdk-java、凭证交由运行时环境注入 |
遵循以上配置,即可彻底解决 AWS SDK v2 在 OSGi 环境中的依赖解析失败问题,稳定支撑 SNS、S3、Lambda 等各类云服务集成。










