导引
历时 8 年磨砺,1.7 万次代码提交,9个分仓库,几百个模块,20多万代码量, 1200 万次半年下载量 —— OpenSolon(即 Solon)正在重新定义 Java 企业级应用开发的性价比。
今日,我们正式发布 OpenSolon v3.8 及其 LTS 维护版本。是一次架构级的跨越:从 AI 领域的 MCP 无状态集群支持,到 Flow 流程引擎的回归通用化,再到对 Java 新版本(v25)的超前布局,OpenSolon 持续践行“快速、小巧、简洁”的克制美学。
无论你是追求算力性价比的极致主义者,还是正在寻找安全可靠的国产基座,这次更新都值得你关注。
- 【超前适配】 率先适配 Java 25,新增 ScopedValue 适配支持
- 【AI 增强】 solon-ai 深度支持 MCP 无状态会话集群与异步工具
- 【架构重构】 solon-flow 回归通用流程引擎,推出全新的 WorkflowService 封装;
- 【性能优化】 全面优化表达式引擎(SnEL)与缓存性能,持续保持高并发、省内存的领先优势。
OpenSolon 开源框架!(也称:Solon)
OpenSolon 是新一代,Java 企业级应用开发框架。从零开始构建(No Java-EE),有灵活的接口规范与开放生态。采用商用友好的 Apache 2.0 开源协议,是“杭州无耳科技有限公司”开源的根级项目,是 Java 应用开发的生态基座(可替换美国博通公司的 Spring 生态)。
- 追求: 快速、小巧、简洁
- 提倡: 克制、高效、开放
7年开源时间,累计代码提交1.6万次 ,近半年下载量1200万次。
同时支持运行时环境(不基于 java-ee 构建,所以可以同时兼容):
- java8, java11, java17, java21, java25
目前有几个主要的项目仓库:
| 代码仓库 |
描述 |
| /opensolon/solon |
Solon ,主代码仓库 |
| /opensolon/solon-examples |
Solon ,官网配套示例代码仓库 |
| |
|
| /opensolon/solon-expression |
Solon Expression ,代码仓库 |
| /opensolon/solon-flow |
Solon Flow ,代码仓库 |
| /opensolon/solon-ai |
Solon Ai ,代码仓库 |
| /opensolon/solon-cloud |
Solon Cloud ,代码仓库 |
| /opensolon/solon-admin |
Solon Admin ,代码仓库 |
| /opensolon/solon-integration |
Solon Integration ,代码仓库 |
| /opensolon/solon-java17 |
Solon Java17 适配仓库(base java17) |
| /opensolon/solon-java25 |
Solon Java25 适配仓库(base java25) |
| |
|
| /opensolon/solon-gradle-plugin |
Solon Gradle ,插件代码仓库 |
| /opensolon/solon-idea-plugin |
Solon Idea ,插件代码仓库 |
| /opensolon/solon-vscode-plugin |
Solon VsCode ,插件代码仓库 |
有什么特点(相对 Java Spring 方案)?
OpenSolon 对国产算力非常友好,对 cpu 和 memory 的需求远低于同类方案。
| 特点 |
描述 |
| 更高的计算性价比 |
并发高 700%;内存省 50% |
| 更快的开发效率 |
代码少;入门简单;启动(或调试重启)快 10倍 |
| 更好的生产与部署体验 |
打包小 90% |
| 更大的兼容范围 |
非 java-ee 架构;同时支持 java8 ~ java25,graalvm native image |
最新的 techempower (第三方知名测试平台)测试数据:
项目架构示意图(全场景应用开发支持)
![]()
v3.8.0 更新说明
- 插件
solon-flow 第六次预览
- 新增
solon-flow-workflow 插件(替代 FlowStatefulService)
- 新增
solon-java25 仓库(提供 ScopedValue 适配)
- 添加
solon ScopeLocal 接口(用于 ThreadLocal 到 ScopedValue 兼容)
- 添加
solon Solon.start(Class, MultiMap) 方法
- 添加
solon ThreadsUtil:newVirtualThreadFactory 方法
- 添加
solon ContextHolder:currentWith 方法,替代 currentSet(标为弃用)
- 添加
solon Controller:remoting 属性(可替代 @Remoting 注解)
- 添加
solon 非依赖关系的 bean 异步初始化(@Init(async=true))
- 添加
solon Stringable 接口
- 添加
solon 'env.use' 配置支持(相对 'env',它与 'env.on' 协作时不会冲突)
- 添加
solon 'server.session.cookieHttpOnly' 配置支持(默认为 true)
- 添加
solon Context.cookieSet(...,httpOnly) 方法
- 添加
solon-test HttpTester protocol 参数支持(方便 https 或 http 切换测试)
- 添加
solon-serialization JsonPropsUtil2.dateAsFormat 添加 java.sql.Timestamp 类型支持
- 添加
solon-config-yaml 依赖 solon-config-snack4 避免单个引入时忘掉
- 添加
solon-net-httputils HttpSslSupplierAny(方便无限制的 ssl 使用,但不建议)
- 添加
solon-web-rx RxEntity 类(方便对接 mcp-sdk)
- 添加
solon-server 会话状态的 cookie httpOnly 配置(默认为 false)
- 添加
solon-server-tomcat ssl 适配支持
- 添加
solon-security-validation ValidatorFailureHandlerI18n 支持验证注解的国际化处理 添加 solon-expression SnelParser 类,为 TemplateParser 和 EvaluateParser 提供出入口和占位符配置
- 添加
solon-flow FlowContext:lastNode() 方法(最后一个运行的节点)
- 添加
solon-flow FlowContext:lastNodeId() 方法(最后一个运行的节点Id)
- 添加
solon-flow Node.getMetaAs, Link.getMetaAs 方法
- 添加
solon-flow NodeSpec:linkRemove 方法(增强修改能力)
- 添加
solon-flow Graph:create(id,title,consumer) 方法
- 添加
solon-flow Graph:copy(graph,consumer) 方法(方便复制后修改)
- 添加
solon-flow GraphSpec:getNode(id) 方法
- 添加
solon-flow GraphSpec:addLoop(id) 方法替代 addLooping(后者标为弃用)
- 添加
solon-flow FlowEngine:eval(Graph, ..) 系列方法
- 添加
solon-ai FunctionPrompt:handleAsync(用于 mcp-server 异步支持)
- 添加
solon-ai FunctionResource:handleAsync(用于 mcp-server 异步支持)
- 添加
solon-ai FunctionTool:handleAsync(用于 mcp-server 异步支持)
- 添加
solon-ai-core ChatMessage:toNdjson,fromNdjson 方法(替代 ChatSession:toNdjson, loadNdjson),新方法机制上更自由
- 添加
solon-ai-core ToolSchemaUtil.jsonSchema Publisher 泛型支持
- 添加
solon-ai-mcp mcp-java-sdk v0.17 适配(支持 2025-06-18 版本协议)
- 添加
solon-ai-mcp mcp-server 异步支持
- 添加
solon-ai-mcp mcp-server streamable_stateless 支持
- 添加
solon-ai-mcp Tool,Resource,Prompt 对 org.reactivestreams.Publisher 异步返回支持
- 添加
solon-ai-mcp McpServerHost 服务宿主接口,用于隔离有状态与无状态服务
- 添加
solon-ai-mcp McpChannel.STREAMABLE_STATELESS (服务端)无状态会话
- 添加
solon-ai-mcp McpClientProvider:customize 方法(用于扩展 roots, sampling 等)
- 添加
solon-ai-mcp mcpServer McpAsyncServerExchange 注入支持(用于扩展 roots, sampling 等)
- 优化
solon api-version 版本匹配
- 优化
solon SnelUtil snel 表达式缺参数时异常提示(避免配错名字)
- 优化
solon ParamWrap:getName 改用 ParamSpec.getAlias。加 '@Param(name=xxx)' 注解可生效
- 优化
solon-cache CacheService 适配没有 _cacheKeyHead 配置时,则不加前缀
- 优化
solon-net-httputils SslContextBuilder
- 优化
solon-expression EvaluateParser 支持定义占位符(可支持 {xxx} 表达式)
- 优化
solon-expression TemplateParser 支持定义占位符(可支持 {xxx} 表达式)
- 优化
solon-expression LRUCache 性能(提高缓存性能)
- 优化
solon-ai-dialect-openai claude 兼容性
- 优化
solon-ai-mcp mcp StreamableHttp 模式下 服务端正常返回时 客户端异常日志打印的情况* 优化 solon-flow eval(Node startNode) 处理,改为从 root 开始恢复到 start 再开始执行(恢复过程中,不会执行任务)
- 优化
solon-flow FlowEngine:eval(Node startNode) 处理,改为从 root 开始恢复到 start 再开始执行(恢复过程中,不会执行任务)
- 调整
nami NamiAttachment 切换为 ScopeLocal 接口实现
- 调整
solon ContextHolder 切换为 ScopeLocal 接口实现
- 调整
solon RunHolder:parallelExecutor 改为 newFixedThreadPool
- 调整
solon-data TranExecutorDefault 切换为 ScopeLocal 接口实现
- 调整
local-solon-cloud-plugin 的 config 和 i18n 服务,如果没有 group 配置,则文件不带 group 前缀(之前默认给了 DEFAULT_GROUP 组名,显得复杂)
- 调整
rocketmq-solon-clouud-plugin 的适配,事件属性不再加 '!' (并兼容旧格式)
- 调整
aliyun-ons-solon-clouud-plugin 的适配,事件属性不再加 '!' (并兼容旧格式)
- 调整
rocketmq5-solon-clouud-plugin 的适配,事件属性不再加 '!' (并兼容旧格式)。添加 sql92 过滤支持
- 调整
solon-flow 移除 Activity 节点预览属性 "$imode" 和 "$omode"
- 调整
solon-flow Activity 节点流出改为自由模式(可以多线流出:无条件直接流出,有条件检测后流出)
- 调整
solon-flow Node.getMeta 方法返回改为 Object 类型(并新增 getMetaAs)
- 调整
solon-flow Evaluation:runTest 改为 runCondition
- 调整
solon-flow FlowContext:incrAdd,incrGet 标为弃用(上下文数据为型只能由输入侧决定)
- 调整
solon-flow Condition 更名为 ConditionDesc
- 调整
solon-flow Task 更名为 ConditionDesc
- 调整
solon-flow XxxDecl 命名风格改为 XxxSpec
- 调整
solon-flow GraphDecl.parseByXxx 命名风格改为 GraphSpec.fromXxx
- 调整
solon-flow Graph.parseByXxx 命名风格改为 Graph.fromXxx
- 调整
solon-ai-mcp getResourceTemplates、getResources 不再共享注册
- 调整
solon-ai-mcp McpServerManager 内部接口更名为 McpPrimitivesRegistry (MCP 原语注册器)
- 调整
solon-ai-mcp McpClientProvider 默认不启用心跳机制(随着 mcp-sdk 的成熟,server 都有心跳机制了)
- 修复
solon IndexFiles 路径表达式的兼容问题(添加转换 *->@、:->!)
- 修复
solon ParamWrap:getName 加 '@Param(name=xxx)' 注解时没有生效的问题(v3.7.0 出现)。对 solon-cache 会有影响
- 修复
solon-web-vertx VxWebContext._requestBody 如果为 null 文件上传时会出错的问题
- 修复
solon-docs-openapi2 返回类型中泛型失效的问题(v3.7.0 出现)
- snack4 升为 4.0.20
- jackson 升为 2.19.2
- liquor 升为 1.6.6
- asm 升为 9.9
solon 仓库补充说明
新特性:
public class Demo {
static ScopeLocal<String> LOCAL = ScopeLocal.newInstance();
public void test(){
LOCAL.with("test", ()->{
System.out.println(LOCAL.get());
});
}
}
solon-ai 仓库补充说明
新特性展示:1.MCP 无状态会话(STREAMABLE_STATELESS)和 2.CompletableFuture 异步MCP工具
@McpServerEndpoint(channel = McpChannel.STREAMABLE_STATELESS, mcpEndpoint = "/mcp1")
public class McpServerTool {
@ToolMapping(description = "查询天气预报", returnDirect = true)
public CompletableFuture<String> getWeather(@Param(description = "城市位置") String location) {
return CompletableFuture.completedFuture("晴,14度");
}
}
传输方式对应表:(服务端与客户端,须使用对应的传输方式才可通讯)
| 服务端 |
客户端 |
备注 |
| STDIO |
STDIO |
|
| SSE |
SSE |
|
| STREAMABLE |
STREAMABLE |
|
| STREAMABLE_STATELESS |
STREAMABLE |
对 server 集群很友好 |
- STREAMABLE_STATELESS 集群,不需要 ip_hash,但“原语”变化后无法通知 client
solon-flow 仓库补充说明
重要变化:
- 取消“有状态”、“无状态”概念。
- solon-flow 回归通用流程引擎(分离“有状态”的概念)。
- 新增 solon-flow-workflow 为工作流性质的封装(未来可能会有 dataflow 等)。
兼容变化对照表:
| 旧名称 |
新名称 |
说明 |
GraphDecl |
GraphSpec |
图定义 |
GraphDecl.parseByXxx |
GraphSpec.fromXxx |
图定义加载 |
Graph.parseByXxx |
Graph.fromXxx |
图加载 |
LinkDecl |
LinkSpec |
连接定义 |
NodeDecl |
NodeSpec |
节点定义 |
Condition |
ConditionDesc |
条件描述 |
Task |
TaskDesc |
任务描述(避免与 workflow 的概念冲突) |
| |
|
|
FlowStatefulService |
WorkflowService |
工作流服务 |
StatefulTask |
Task |
任务 |
Operation |
TaskAction |
任动工作 |
TaskType |
TaskState |
任务状态 |
FlowStatefulService 到 WorkflowService 的接口变化对照表:
| 旧名称 |
新名称 |
说明 |
postOperation(..) |
postTask(..) |
提交任务 |
postOperationIfWaiting(..) |
postTaskIfWaiting(..) |
提交任务 |
| |
|
|
evel(..) |
/ |
执行 |
stepForward(..) |
/ |
单步前进 |
stepBack(..) |
/ |
单步后退 |
| |
|
|
| / |
getState(..) |
获取状态 |
新特性预览:Graph 硬编码方式(及修改能力增强)
//硬编码
Graph graph = Graph.create("demo1", "示例", spec -> {
spec.addStart("start").title("开始").linkAdd("01");
spec.addActivity("n1").task("@AaMetaProcessCom").linkAdd("end");
spec.addEnd("end").title("结束");
});
//修改
Graph graphNew = Graph.copy(graph, spec -> {
spec.getNode("n1").linkRemove("end").linkAdd("n2"); //移掉 n1 连接;改为 n2 连接
spec.addActivity("n2").linkAdd("end");
});
新特性预览:FlowContext:lastNodeId (计算的中断与恢复)。参考:https://solon.noear.org/article/1246
flowEngine.eval(graph, context.lastNodeId(), context);
//...(从上一个节点开始执行)
flowEngine.eval(graph, context.lastNodeId(), context);
新特性预览:WorkflowService(替代 FlowStatefulService)
WorkflowService workflow = WorkflowService.of(engine, WorkflowDriver.builder()
.stateController(new ActorStateController())
.stateRepository(new InMemoryStateRepository())
.build());
//1. 取出任务
Task task = workflow.getTask(graph, context);
//2. 提交任务
workflow.postTask(task.getNode(), TaskAction.FORWARD, context);