【Java手搓OpenManus】-1- 环境准备
本文介绍了使用Java复刻OpenManus AI Agent项目的环境准备过程。作者选择Java 21作为开发语言,利用其虚拟线程特性处理高并发任务,并对比了Java与Python生态的技术选型。文章详细说明了项目创建步骤,包括Spring Boot初始化、JDK版本选择,以及核心依赖的引入配置,如LangChain4j(0.29.1)用于LLM集成、Playwright(1.40.0)实现浏览
【Java手搓OpenManus】-1- 环境准备
0 代码仓库地址
https://github.com/bblb-sjb/bao-openmanus
觉得项目不错的话辛苦点个star⭐~
1 引言

在之前的章节我们使用并探索过OpenManus。这是一个很好的开源项目,我们之前博客也介绍过,有兴趣的小伙伴可以去看下:https://bblb-sjb.blog.csdn.net/article/details/154429976?spm=1001.2014.3001.5502
本系列的目标是:抛开 Python,从零开始使用 Java 复刻 OpenManus 的核心功能,打造一个属于 Java 生态的通用 AI Agent。
本章作为开篇,我们将完成项目的基础环境搭建和核心框架的初始化。
2 技术选型
为了对标 Python 版本的生态,我们精心挑选了 Java 领域的最佳实践组件:
| 技术 | 版本 | 用途 | Python 对应 |
|---|---|---|---|
| Java | 21 | 编程语言 | Python 3.x |
| LangChain4j | 0.29.1 | LLM 集成 | openai SDK |
| Playwright | 1.40.0 | 浏览器自动化 | browser-use |
2.1 为什么使用java21?
之前的 RAG 项目我们使用了 Java 17,但本次选择 Java 21 的核心原因是 虚拟线程。
OpenManus Agent 需要频繁进行网络 IO(调用 LLM、操控浏览器),Python 版使用 async/await 协程来处理。而 Java 21 的虚拟线程让我们能以同步代码的风格编写高并发程序,既保留了代码的可读性,又拥有媲美协程的性能。
3 环境搭建
3.1 创建项目
使用 IDEA 创建一个新的 Spring Boot 项目,确保 JDK 选择 Java 21。
3.2 引入依赖
在pom.xml中添加
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.alibaba.manus</groupId>
<artifactId>bao-openmanus</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- Dependency Versions -->
<spring-boot.version>3.2.0</spring-boot.version>
<langchain4j.version>0.29.1</langchain4j.version>
<playwright.version>1.40.0</playwright.version>
<lombok.version>1.18.30</lombok.version>
<jackson.version>2.16.0</jackson.version>
<slf4j.version>2.0.9</slf4j.version>
<logback.version>1.4.14</logback.version>
<junit.version>5.10.1</junit.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- LangChain4j for LLM integration -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>${langchain4j.version}</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>${langchain4j.version}</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-anthropic</artifactId>
<version>${langchain4j.version}</version>
</dependency>
<!-- Playwright for browser automation -->
<dependency>
<groupId>com.microsoft.playwright</groupId>
<artifactId>playwright</artifactId>
<version>${playwright.version}</version>
</dependency>
<!-- Lombok for reducing boilerplate -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<!-- Jackson for JSON processing -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<!-- Configuration -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- Testing -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>21</source>
<target>21</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
- Spring Boot Starter:提供依赖注入、自动配置等能力
- LangChain4j:LLM 集成库,支持 OpenAI、Anthropic 等
- Playwright:浏览器自动化工具
- Lombok:编译时生成 getter/setter 等代码
- Jackson:JSON 序列化/反序列化
- JUnit 5:单元测试框架
3.2 添加配置
为了灵活切换模型和调整参数,我们设计了如下配置结构。这里以阿里云百炼(兼容 OpenAI 协议)为例:
openmanus:
llm:
provider: openai
api-key: "sk-your-api-key-here" # 请替换为你的 API Key
model: "qwen-flash"
base-url: "https://dashscope.aliyuncs.com/compatible-mode/v1"
max-tokens: 4096
temperature: 0.0
# Vision 模型配置 - 对应 Python: [llm.vision] (可选)
vision:
provider: openai # 用于图像处理的模型
api-key: "sk-your-vision-api-key-here"
model: "qwen-plus" # 例如:qwen-plus, gpt-4o
base-url: "https://dashscope.aliyuncs.com/compatible-mode/v1"
max-tokens: 4096
temperature: 0.0
# 浏览器配置
browser:
headless: false
disable-security: true
max-content-length: 2000
# Agent 配置
agent:
max-steps: 20
workspace-root: "./workspace"
# Spring Boot 日志配置
logging:
level:
com.openmanus: INFO
root: INFO
3.3 配置类实现
在com.openmanus.infrastructure.config.OpenManusConfig中添加配置信息
使用 @ConfigurationProperties 自动绑定 YAML 配置
package com.openmanus.infrastructure.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* OpenManus 配置类
*/
@Data
@ConfigurationProperties(prefix = "openmanus")
public class OpenManusConfig {
/**
* LLM 配置
*/
@Data
public static class LLMConfig {
private String provider = "openai";
private String apiKey = "sk-xxx";
private String model = "qwen-flash";
private String baseUrl = "https://dashscope.aliyuncs.com/compatible-mode/v1";
private Integer maxTokens = 4096;
private Double temperature = 0.0;
/**
* Vision 模型配置
* 用于处理图像相关的任务
*/
@Data
public static class VisionConfig {
private String provider = "openai";
private String apiKey = "sk-xxx";
private String model = "qwen-flash";
private String baseUrl = "https://dashscope.aliyuncs.com/compatible-mode/v1";
private Integer maxTokens = 4096;
private Double temperature = 0.0;
}
private VisionConfig vision;
}
/**
* 浏览器配置
*/
@Data
public static class BrowserConfig {
private Boolean headless = false;
private Boolean disableSecurity = true;
private Integer maxContentLength = 2000;
}
/**
* Agent 配置
*/
@Data
public static class AgentConfig {
private Integer maxSteps = 20;
private String workspaceRoot = "./workspace";
}
private LLMConfig llm = new LLMConfig();
private BrowserConfig browser = new BrowserConfig();
private AgentConfig agent = new AgentConfig();
}
4 启动类
我们实现 CommandLineRunner 接口,以便在 Spring 容器启动后直接执行 Agent 逻辑。
package com.openmanus;
import com.openmanus.infrastructure.config.OpenManusConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
/**
* OpenManus Java 版本主入口 - 对应 Python 版本的 main.py
*
* 提供命令行交互界面,运行 Agent
*/
@Slf4j
@SpringBootApplication
@EnableConfigurationProperties(OpenManusConfig.class)
public class OpenManusApplication implements CommandLineRunner {
@Autowired
private OpenManusConfig config;
public static void main(String[] args) {
SpringApplication.run(OpenManusApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
log.info("Starting OpenManus Java Edition...");
log.info("LLM Provider: {}", config.getLlm().getProvider());
log.info("LLM Model: {}", config.getLlm().getModel());
log.info("Configuration loaded successfully!");
// 后续章节将在这里添加 Agent 初始化逻辑
}
}
4.1 启动类测试
点击 IDE 的运行按钮,观察控制台日志:
说明基础脚手架搭建成功,配置读取无误。
5 总结
本章我们完成了 Java 版 OpenManus 的地基建设
下一章我们将着手领域模型设计,实现 OpenManus 的核心领域模型。
更多推荐

所有评论(0)