教程

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 API Vision 图像理解完全指南:图片分析、截图解读与多图处理Claude API 视觉能力(Vision)完整使用指南:支持的图像格式(PNG/JPEG/GIF/WebP)与大小限制、Base64 编码图像传入方式、URL 直接引用图像、多张图片同时分析、图像与文字混合输入、典型应用场景(截图调试/图表解读/文档扫描/UI分析)、图像 Token 计算方式和成本优化,以及 Python/TypeScript 完整代码示例。2026/3/20教程Claude API 流式输出完全指南:Server-Sent Events 实时响应实战Claude API 流式输出(Streaming)完整教程:为什么用流式输出(用户体验提升50%+)、Server-Sent Events 协议原理、Python/Node.js/curl 三种实现方式、stream=True 的事件类型(message_start/content_block_delta/message_stop)、流式 Tool Use 的特殊处理、在 FastAPI/Express/Next.js 中实现流式 API 端点,以及流式输出的错误处理和超时配置。2026/3/20教程Anthropic Python SDK 完全指南:从安装到生产级集成的最佳实践Anthropic Python SDK 完整使用指南:安装配置、同步与异步客户端、流式输出、工具调用(Tool Use)、视觉 API、Prompt Caching、错误处理与重试、Token 用量追踪、httpx 客户端自定义,以及在 Django/FastAPI/Flask 框架中的集成最佳实践。2026/3/16教程Claude API Key 申请完整教程:从注册 Anthropic Console 到第一次调用Claude API Key 申请完整指南:Anthropic Console 注册、充值方式、API Key 生成与管理、Python/curl 第一次调用验证、用量监控、费用控制与限额设置,以及免费额度和各模型计费说明。2026/3/15