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

EC2 Ubuntu实例中使用AmazonSimpleEmailServiceClientBuilder遇ClassNotFoundException

解决AWS SES Java SDK 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.jar
  • aws-java-sdk-core.jar
  • jackson-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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:26:34