教程

Anthropic Claude SDK Java 完全接入指南:Java/Spring Boot 调用 Claude API(2026)

Anthropic 官方 Java SDK 完整使用指南:Maven/Gradle 安装、基础消息调用、流式输出(Streaming/SSE)、Spring Boot 集成(@Bean/@Service/REST API)、多轮对话状态管理、异步调用(CompletableFuture 并发)、Spring WebFlux 流式 SSE 接口,覆盖 Claude Sonnet/Haiku 全系列模型,附企业级生产代码示例。

2026/3/273分钟 阅读ClaudeEagle

Java 是企业级后端的主流语言。 本文覆盖在 Java 和 Spring Boot 项目中 接入 Anthropic Claude API 的完整方法。

安装(Maven)

xml
<dependency>
    <groupId>com.anthropic</groupId>
    <artifactId>sdk</artifactId>
    <version>1.0.0</version>
</dependency>

Gradle:

gradle
implementation 'com.anthropic:sdk:1.0.0'

基础调用

java
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.messages.*;

public class ClaudeExample {
    public static void main(String[] args) {
        AnthropicClient client = AnthropicOkHttpClient.builder()
            .apiKey(System.getenv("ANTHROPIC_API_KEY"))
            .build();

        Message message = client.messages().create(
            MessageCreateParams.builder()
                .model(Model.CLAUDE_SONNET_4_5)
                .maxTokens(1024)
                .addUserMessage("帮我写一个 Java 线程池最佳实践示例")
                .build()
        );

        // 获取文本内容
        message.content().stream()
            .filter(block -> block.type() == ContentBlock.Type.TEXT)
            .forEach(block -> System.out.println(block.text().get()));
    }
}

流式输出

java
try (MessageStream stream = client.messages().stream(
    MessageCreateParams.builder()
        .model(Model.CLAUDE_SONNET_4_5)
        .maxTokens(2048)
        .addUserMessage("详细解释 Java 虚拟线程(Project Loom)的原理")
        .build()
)) {
    stream.on(MessageStreamEvent.class, event -> {
        if (event instanceof ContentBlockDeltaEvent delta) {
            if (delta.delta().type() == ContentBlockDelta.Type.TEXT_DELTA) {
                System.out.print(delta.delta().text().get());
            }
        }
    });

    // 等待流完成
    stream.finalMessage();
}

Spring Boot 集成

java
// ClaudeConfig.java
@Configuration
public class ClaudeConfig {
    @Value("${anthropic.api-key}")
    private String apiKey;

    @Bean
    public AnthropicClient anthropicClient() {
        return AnthropicOkHttpClient.builder()
            .apiKey(apiKey)
            .build();
    }
}

// ClaudeService.java
@Service
public class ClaudeService {
    private final AnthropicClient client;

    public ClaudeService(AnthropicClient client) {
        this.client = client;
    }

    public String chat(String userMessage) {
        Message response = client.messages().create(
            MessageCreateParams.builder()
                .model(Model.CLAUDE_SONNET_4_5)
                .maxTokens(1024)
                .addSystemMessage("你是一个专业的技术助手,使用中文回复。")
                .addUserMessage(userMessage)
                .build()
        );

        return response.content().stream()
            .filter(b -> b.type() == ContentBlock.Type.TEXT)
            .findFirst()
            .map(b -> b.text().get())
            .orElse("");
    }
}

// ClaudeController.java(REST API 接口)
@RestController
@RequestMapping("/api/chat")
public class ClaudeController {
    private final ClaudeService claudeService;

    @PostMapping
    public ResponseEntity<Map<String, String>> chat(@RequestBody Map<String, String> req) {
        String reply = claudeService.chat(req.get("message"));
        return ResponseEntity.ok(Map.of("reply", reply));
    }
}

application.properties:

properties
anthropic.api-key=${ANTHROPIC_API_KEY}

多轮对话状态管理

java
@Service
@Scope("prototype")
public class ChatSession {
    private final AnthropicClient client;
    private final List<MessageParam> history = new ArrayList<>();

    public String chat(String userMessage) {
        history.add(MessageParam.builder()
            .role(MessageParam.Role.USER)
            .content(userMessage)
            .build());

        Message response = client.messages().create(
            MessageCreateParams.builder()
                .model(Model.CLAUDE_SONNET_4_5)
                .maxTokens(2048)
                .messages(history)
                .build()
        );

        String assistantReply = response.content().get(0).text().get();
        history.add(MessageParam.builder()
            .role(MessageParam.Role.ASSISTANT)
            .content(assistantReply)
            .build());

        return assistantReply;
    }

    public void clearHistory() { history.clear(); }
}

异步调用(CompletableFuture)

java
public CompletableFuture<String> chatAsync(String message) {
    return CompletableFuture.supplyAsync(() -> {
        Message response = client.messages().create(
            MessageCreateParams.builder()
                .model(Model.CLAUDE_HAIKU_4_5) // Haiku 速度更快
                .maxTokens(512)
                .addUserMessage(message)
                .build()
        );
        return response.content().get(0).text().get();
    });
}

// 批量并发调用
public List<String> batchChat(List<String> messages) throws Exception {
    List<CompletableFuture<String>> futures = messages.stream()
        .map(this::chatAsync)
        .toList();

    return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
        .thenApply(v -> futures.stream().map(CompletableFuture::join).toList())
        .get(30, TimeUnit.SECONDS);
}

Spring WebFlux 流式 SSE 接口

java
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamChat(@RequestParam String message) {
    return Flux.create(emitter -> {
        try (MessageStream stream = client.messages().stream(
            MessageCreateParams.builder()
                .model(Model.CLAUDE_SONNET_4_5)
                .maxTokens(2048)
                .addUserMessage(message)
                .build()
        )) {
            stream.on(ContentBlockDeltaEvent.class, event -> {
                event.delta().text().ifPresent(emitter::next);
            });
            stream.finalMessage();
            emitter.complete();
        } catch (Exception e) {
            emitter.error(e);
        }
    });
}

来源:Anthropic Claude API 文档 - docs.anthropic.com/en/api

相关文章推荐

教程Anthropic Claude SDK Go 完全接入指南:Go 语言调用 Claude API 实战(2026)Anthropic 官方 Go SDK 完整使用指南:安装配置、基础消息调用、流式输出(Streaming)、多轮对话状态管理、System Prompt 设置、并发批量调用(信号量控制并发/Rate Limit)、图片视觉理解(Vision/Base64)、错误处理与自动重试,覆盖 Claude Sonnet/Haiku 全系列模型,附生产级代码示例。2026/3/27教程Anthropic Node.js SDK 完全指南:TypeScript/JavaScript 接入 Claude APIAnthropic 官方 Node.js SDK(@anthropic-ai/sdk)完整教程:安装与初始化、基础对话调用、流式输出(stream)、图像输入(Base64/URL)、Tool Use 函数调用、系统提示、消息历史管理、Prompt Caching 配置、错误处理最佳实践(指数退避重试),以及 TypeScript 类型系统深度使用,适合 Node.js / Next.js / NestJS 开发者快速上手。2026/3/20教程Claude Code 官方最佳实践完全指南:Anthropic 工程团队总结的 25 条黄金法则Anthropic 官方 Best Practices 完整整理:核心约束(上下文管理);给 Claude 可验证标准(最高杠杆);探索→规划→实现→提交四步流程;精准提示 4 策略;丰富上下文输入方式;CLAUDE.md 有效写法(含 ✅/❌ 清单和 @ 引入语法);权限预设;CLI 工具配置;MCP 服务器选择;Hooks 自动化;Skills vs CLAUDE.md 选择;高效沟通技巧;会话管理(提前纠正/激进 /compact/Subagent 调研);以及非交互模式和多 Session 并行的规模化技巧。2026/5/8教程Anthropic Claude API 完整开发指南 2026:Prompt 缓存、自适应推理、工具调用全解析Claude API 2026 年完整开发指南:模型选型和最新定价(Haiku/Sonnet/Opus 对比)、Prompt 缓存实现(最高节省 90% 成本,含代码示例)、自适应推理替代旧 budget_tokens(含流式实现)、工具调用完整循环、流式响应(含 Next.js App Router 示例)、视觉能力(Opus 4.7 支持 3.75MP),以及生产最佳实践(重试、成本监控)。2026/4/24教程MCP 完整入门指南 2026:Model Context Protocol 是什么、为什么重要、怎么用MCP(Model Context Protocol)完整入门:解决的核心问题(定制集成 vs 通用协议)、三角色架构(Host/Client/Server)、三种能力(Tools/Resources/Prompts)、Stdio vs HTTP 传输、在 Claude Code 里配置常用 Server(GitHub/PostgreSQL/文件系统),以及用 TypeScript SDK 构建自己的 MCP Server。2026/4/21教程Claude Haiku 4 完全使用指南:高速低成本模型适合哪些场景?(2026)Claude Haiku 4 完整使用指南:Haiku 在三档模型中的定位($0.80/$4 每百万 Token)、最适合的 5 类场景(批量分类/实时对话/结构化提取/代码片段/内容审核)、与 Sonnet/Opus 的选型对比表、生产环境混合策略(动态模型选择降低 40-60% 成本),附 Claude Code 中使用 Haiku 批量处理的命令示例。2026/3/28