EC2 Ubuntu实例中使用AmazonSimpleEmailServiceClientBuilder遇ClassNotFoundException
嘿,这个问题我之前帮好几个开发者搞定过,结合你的场景——EC2 Ubuntu实例、爱尔兰区域(eu-west-1)、已经验证SES邮箱——出现ClassNotFoundException大概率是依赖缺失、SDK版本不匹配或者Classpath配置不对,咱们一步步来排查解决:
1. 优先确认AWS Java SDK依赖是否正确引入
你用的AmazonSimpleEmailServiceClientBuilder是AWS Java SDK V1的API,所以必须确保项目中引入了对应的SES依赖:
如果用Maven管理依赖
添加SES依赖(建议用最新稳定版,避免版本兼容问题):
<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-ses</artifactId> <version>1.12.500</version> </dependency>
更稳妥的方式是引入AWS SDK BOM来统一管理所有SDK版本,避免冲突:
<dependencyManagement> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-bom</artifactId> <version>1.12.500</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
如果用Gradle管理依赖
implementation 'com.amazonaws:aws-java-sdk-ses:1.12.500'
如果手动管理JAR包
需要下载以下核心JAR并放到项目的Classpath中(比如Ubuntu上应用的lib目录或Tomcat的WEB-INF/lib):
aws-java-sdk-ses.jaraws-java-sdk-core.jarjackson-databind.jar、jackson-core.jar、jackson-annotations.jar(JSON序列化依赖)commons-logging.jar(日志依赖)
2. 明确指定SES区域(避免默认区域问题)
你的EC2在爱尔兰区域(eu-west-1),构建客户端时最好明确指定区域,这不仅是最佳实践,也能避免因默认区域不匹配导致的潜在问题:
import com.amazonaws.regions.Regions; import com.amazonaws.services.simpleemail.AmazonSimpleEmailService; import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClientBuilder; // 构建客户端时指定区域 AmazonSimpleEmailService client = AmazonSimpleEmailServiceClientBuilder.standard() .withRegion(Regions.EU_WEST_1) .build();
3. 确保EC2实例的IAM权限配置正确
虽然这不是ClassNotFoundException的直接原因,但解决依赖问题后很可能遇到权限报错,提前配置好:
给EC2实例关联的IAM角色添加以下策略,允许SES发送邮件:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ses:SendEmail", "Resource": "*" } ] }
这样无需在代码中硬编码AWS凭证,更安全。
4. 验证Ubuntu上的Classpath配置
如果是通过命令行运行Java应用,要确保所有依赖JAR都被包含在Classpath中:
# 假设你的应用JAR是app.jar,依赖JAR都在lib目录下 java -cp "app.jar:lib/*" com.yourpackage.YourMainClass
如果是Tomcat等容器部署,要确认依赖JAR已放到WEB-INF/lib目录,容器启动时会自动加载这些JAR。
5. 避免V1和V2 SDK混淆
AWS Java SDK有V1和V2两个大版本,API完全不同:
- V1的API是
com.amazonaws.services.simpleemail.* - V2的API是
software.amazon.awssdk.services.ses.*
如果你的项目中同时引入了V1和V2的依赖,或者用了V2的依赖却写V1的代码,也会出现ClassNotFoundException,务必保持依赖和代码版本一致。
按照以上步骤排查,应该能快速解决ClassNotFoundException问题。如果还有疑问,可以把项目的依赖配置或者报错的完整堆栈信息贴出来,我再帮你细化分析。
内容的提问来源于stack exchange,提问作者SteveOhio

