Java调用Twilio发送短信时Gradle任务':StockAlertClass:SMS.main()'执行失败
报错原因
核心本质是你的Java程序运行时抛出了未捕获的异常,导致进程非正常退出,返回状态码1,Gradle因此触发任务执行失败报错。具体高频诱因如下:
- 环境变量读取失败:代码中
ACCOUNT_SID、AUTH_TOKEN通过System.getenv()读取,若程序运行的上下文(IDE运行配置/命令行执行环境)未配置对应环境变量,两个值为null,调用Twilio.init()时直接触发空指针异常。 - 依赖配置冲突:
build.gradle中重复声明了twilio的implementation和runtimeOnly依赖,可能引发类加载冲突;同时slf4j版本过低,可能和Twilio的日志依赖不兼容。 - 号码格式或权限错误:收/发信号码未带完整国际区号前缀,或Twilio试用账号未提前验证收信号码,调用短信发送接口时触发API权限错误。
解决方案
- 排查环境变量配置
如果是IDE运行,在对应运行配置的「环境变量」栏添加ACCOUNT_SID、AUTH_TOKEN的实际键值对;如果是命令行运行,执行命令前先导出环境变量:
export ACCOUNT_SID=你的Twilio账户SID export AUTH_TOKEN=你的Twilio账户令牌
测试阶段可以临时把两个常量硬编码为实际值,确认是不是环境变量读取问题,测试完成后及时改回避免敏感信息泄露。
- 修正
build.gradle依赖配置
删除重复的Twilio依赖,升级slf4j到稳定兼容版本,修改后的依赖块参考:
dependencies { implementation 'org.slf4j:slf4j-simple:1.7.36' implementation 'com.sparkjava:spark-core:2.9.4' implementation group: "com.twilio.sdk", name: "twilio", version: "8.21.0" testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' }
修改后执行./gradlew clean build清空旧的构建缓存重新编译。
- 校验号码权限与格式
- 收信号码和Twilio分配的发信号码都要完整带+前缀的国际区号,比如中国大陆号码格式为
+8613xxxxxxxxx - Twilio试用账号必须先在控制台将收信号码加入验证列表,才能成功接收测试短信
- 增加异常捕获定位具体问题
修改SMS类的Message()方法,添加异常捕获打印具体错误栈:
public static void Message() { try { if (ACCOUNT_SID == null || AUTH_TOKEN == null) { System.out.println("环境变量读取失败,请检查ACCOUNT_SID和AUTH_TOKEN配置"); return; } Twilio.init(ACCOUNT_SID, AUTH_TOKEN); Message message = Message.creator(new PhoneNumber("+完整收信号码"), new PhoneNumber("+完整Twilio发信号码"), "Test ").create(); System.out.println(message.getSid()); } catch (Exception e) { e.printStackTrace(); } }
- 开启debug日志获取完整信息
执行./gradlew run --debug运行程序,查看完整运行日志定位具体异常原因。
内容的提问来源于stack exchange,提问作者Mark Mingo
相关产品推荐
相关产品推荐

