这里写目录标题
结论先行
•
<url>
参数的数据类型是
String,一次只能填一个地址,因此“同一次执行自动同时上传到两个 URL”
插件默认不支持。
• 想发给多套服务端,可用下面 3 种曲线救国办法,任选其一:
方案 1 在同一个 plugin 里声明 多次 execution
Maven 允许同一插件在同一项目中执行多次,每次 execution 可以带自己的一组 <configuration>
。
Smart-Sugar 的 tree
(或 upload
)goal 不依赖其他 goal 输出,所以可以安全地跑多次。
<plugin>
<groupId>com.cupdata.sinka</groupId>
<artifactId>smart-sugar-maven-plugin</artifactId>
<version>1.7-RC3</version>
<executions>
<!-- 第一次:主服务器 -->
<execution>
<id>upload-main</id>
<phase>verify</phase>
<goals><goal>tree</goal></goals>
<configuration>
<url>http://10.188.40.116:9999/smartsugar/api/tree</url>
</configuration>
</execution>
<!-- 第二次:备份服务器 -->
<execution>
<id>upload-backup</id>
<phase>verify</phase> <!-- 也可以改成 deploy 等别的生命周期 -->
<goals><goal>tree</goal></goals>
<configuration>
<url>http://backup.example.com:8080/smartsugar/api/tree</url>
</configuration>
</execution>
</executions>
</plugin>
执行一次 mvn clean verify
就会 顺序 调用两次 goal,各自向不同 URL 发送相同 JSON。
缺点:构建日志会打印两遍;若依赖树很大,序列化会重复耗时几秒。
方案 2 CI/脚本里 跑两次插件,每次改系统属性
# 主服务器
mvn smart-sugar:tree -Dsugar.url=http://10.188.40.116:9999/smartsugar/api/tree
# 备份服务器
mvn smart-sugar:tree -Dsugar.url=http://backup.example.com:8080/smartsugar/api/tree
好处:无需改 POM;哪怕不想污染正式仓库,也能在流水线里实现多端上传。
缺点:需要跑两条命令;如果项目很大,依赖计算时间会重复花费(同方案 1)。
方案 3 服务器侧做 HTTP“镜像”转发
如果你能改主服务器或网关配置,可让它收到 POST 后自动复制请求到 N 个后端。
常见做法:
• Nginx mirror
指令
location /smartsugar/api/tree {
mirror /mirror_backend; # 复制请求
proxy_pass http://main_backend; # 原路继续
}
location /mirror_backend {
internal; # 外部不可直接访问
proxy_pass http://backup.example.com:8080;
}
• 或 API 网关 / ServiceMesh 的流量复制功能
优点:构建端只发一次,网络/CPU 开销最小;后端想加多少台都不改客户端。
缺点:需要运维权限,且镜像失败时主请求不受影响,备份可能丢失。
为什么直接写两个 <url>
不行?
插件源码里大致是:
@Parameter(name = "url", required = true)
private String url;
...
HttpPost post = new HttpPost(url); // 只接受一个字符串
也就是单值字段;不支持逗号分隔、数组或多标签,所以必须靠上面三种办法间接实现。
小结
• 插件原生只能接收 一个 URL。
• 想多目标上传:
- 在 POM 里配置多个
<execution>
; - 或者用 CI/脚本跑两次并用
-Dsugar.url=
覆盖; - 最彻底的做法是在服务器或网关层面做请求镜像。
根据你的控制范围和可接受的构建时长选择即可。