Lincoln-cn/JCodeIndexer
GitHub: Lincoln-cn/JCodeIndexer
通过在 AST 级别索引 Java 代码并以 MCP Server 暴露查询接口,帮助 AI 编程助手高效理解陌生项目结构并大幅节省 token 消耗。
Stars: 1 | Forks: 0
# Java 代码索引器
[中文](README.zh-CN.md) | English
## 为什么需要
如今,AI 编程助手在探索一个陌生的 Java 项目时:
| 任务 | 不使用 Java Code Indexer | 使用 Java Code Indexer |
|------|--------------------------|----------------------|
| 查找 `UserService` 的定义位置 | 跨 100 多个文件执行 `grep`(约 1.5 万 token) | `find_symbol("UserService")`(约 200 token) |
| 了解 `saveOrder()` 的所有调用者 | 逐一阅读文件(约 8 千 token) | `get_call_graph("saveOrder", "callers")`(约 500 token) |
| 在 YAML/properties 中查找配置值 | 使用 `find` + `cat` 检索多个配置文件(约 5 千 token) | `search_config("spring.datasource.url")`(约 200 token) |
| 定位所有依赖 | 打开 pom.xml + 传递依赖(约 3 千 token) | `find_dependencies("spring-boot-starter")`(约 300 token) |
## 安装
需要 **Java 21+**(JRE 或 JDK)。Docker 和 Native Image 选项自带运行时。
**选项 1:下载 JAR(推荐)**
```
# 从 GitHub Releases 下载
curl -LO https://github.com/sodlinken/java-code-indexer/releases/latest/download/java-code-indexer-latest.jar
```
**选项 2:从源码构建**(需要 Java 21+ 和 Maven 3.8+)
```
git clone https://github.com/sodlinken/java-code-indexer.git
cd java-code-indexer
mvn package -q -DskipTests
# 输出:target/java-code-indexer-*-shaded.jar
```
**选项 3:Native Image (GraalVM)**
```
native-image -jar target/java-code-indexer-*-shaded.jar \
-o jindexer --no-fallback
```
**选项 4:Docker**
```
docker pull ghcr.io/sodlinken/java-code-indexer:latest
```
## 快速开始
```
# 1. 索引你的 Java 项目
java -jar jindexer.jar --project-root /path/to/your/java-project --index
# 2. 启动 MCP 服务器 (stdio,适用于 Claude Code / Qwen Code / Cursor)
java -jar jindexer.jar --project-root /path/to/your/java-project
```
就是这样。你的 AI 助手现在可以直接查询你的代码库结构,而无需阅读文件。
## CLI 参考
```
java -jar jindexer.jar [options]
Options:
--project-root Java project root directory (default: current dir)
--data-dir Index data directory (default: .jindexer)
--init Initialize database schema only
--index Run indexer (extract symbols/references/calls)
--help, -h Show help
No flags → start MCP server over stdio.
```
## MCP 工具
作为 MCP 服务器运行时,Java Code Indexer 会暴露以下工具:
| 工具 | 描述 |
|------|-------------|
| `find_symbol` | 按名称查找符号(类/方法/字段),支持 `*` 通配符 |
| `find_references` | 查找某个符号的所有引用位置 |
| `get_call_graph` | 方法调用关系图——调用者、被调用者或两者 |
| `search_code` | 搜索符号名称和代码内容 |
| `get_file_info` | 文件详情:符号、代码块、调用关系 |
| `search_config` | 搜索配置文件(YAML / Properties / .env) |
| `find_dependencies` | 搜索项目依赖(Maven / Gradle) |
| `semantic_search` | 语义搜索(需要 Embedding 配置,尚未激活) |
| `list_projects` | 列出已索引的项目(仅限多项目模式) |
## 配置
在你的项目根目录下创建 `.jindexer/config.yaml`(可选):
```
project_root: /path/to/project
data_dir: .jindexer
threads: 4
embedding:
enabled: false
```
### 环境变量
| 变量 | 描述 | 默认值 |
|----------|-------------|---------|
| `INDEXER_EMBEDDING_ENABLED` | 启用 Embedding API | `false` |
| `INDEXER_EMBEDDING_BASE_URL` | Embedding API endpoint | — |
| `INDEXER_EMBEDDING_MODEL` | Embedding 模型名称 | — |
| `INDEXER_THREADS` | 索引线程数 | `4` |
| `INDEXER_LOG_LEVEL` | 日志级别 | `INFO` |
优先级:CLI flags → 环境变量 → 配置文件 → 默认值。
## AI 助手集成
### Qwen Code / Claude Desktop / Cursor
添加到你的 MCP 配置中:
```
{
"mcpServers": {
"java-code-indexer": {
"command": "/path/to/jdk-21/bin/java",
"args": ["-jar", "/path/to/jindexer.jar", "--project-root", "/path/to/project"]
}
}
}
```
## 工作原理
```
┌──────────────┐ MCP (stdio) ┌──────────────────────┐
│ AI Assistant │ ◄─────────────────► │ Java Code Indexer │
│ (Qwen/Claude)│ JSON-RPC │ │
└──────────────┘ │ ┌────────────────┐ │
│ │ JavaParser AST │ │
│ └───────┬────────┘ │
│ ▼ │
│ ┌────────────────┐ │
│ │ SQLite (WAL) │ │
│ │ symbols │ │
│ │ references │ │
│ │ call_graphs │ │
│ │ configs │ │
│ │ dependencies │ │
│ └────────────────┘ │
└──────────────────────┘
```
### 索引策略
1. 通过文件系统遍历访问 Java 源码文件
2. 通过 SHA-1 内容哈希跳过未更改的文件(增量索引)
3. JavaParser AST 提取符号、引用和调用关系
4. POM/Gradle 解析器提取依赖信息
5. 配置解析器提取 YAML/Properties/.env 条目
6. 将所有数据 upsert 到内嵌的 SQLite 中(WAL 模式)
### 数据库 Schema
五个核心表:
- **`symbols`** — 类、方法、字段及其位置和签名
- **`references`** — 跨代码库的符号使用位置
- **`calls`** — 方法调用关系(caller → callee)
- **`chunks`** — 类/方法粒度的代码切片
- **`file_hashes`** — 用于增量索引的 SHA-1 哈希值
## 架构
```
src/main/java/com/sodlinken/jindexer/
├── cli/ # CLI entry point
├── mcp/ # MCP server (JSON-RPC over stdio)
├── config/ # YAML config loader
├── storage/ # SQLite schema & StorageService
├── indexer/ # Incremental indexing engine
├── parser/ # Java, POM, Gradle, Config parsers
├── chunker/ # Code chunking (class/method slices)
├── search/ # Structured search provider
├── model/ # Data models (Symbol, Call, Chunk, etc.)
└── util/ # SHA-1 hashing utility
```
## 分发
产物输出到 `release//` 目录。
### 一键构建
```
# 构建 Fat JAR + Native Image
./script/release.sh
# 指定版本号
./script/release.sh -v 1.0.0
# 跳过 Native Image
./script/release.sh -v 1.0.0 --skip-native
```
### Fat JAR
构建产物位于 `release//java-code-indexer-.jar`,需 Java 21+。
```
java -jar release/1.0.0/java-code-indexer-1.0.0.jar --project-root /path/to/project
```
### Native Image (GraalVM)
构建产物位于 `release//jindexer`,无需 JVM,启动即时。
```
./release/1.0.0/jindexer --project-root /path/to/project --index
```
### Docker
```
# 本地构建并运行
docker build -t java-code-indexer .
docker run --rm -v /path/to/project:/project java-code-indexer --project-root /project --index
# 推送到私有 registry
DOCKER_REGISTRY=your-registry.com ./script/release.sh --push-docker
```
## 开发
```
# 克隆并构建
git clone https://github.com/sodlinken/java-code-indexer.git
cd java-code-indexer
mvn package -q -DskipTests
# 索引该项目本身
java -jar target/java-code-indexer-*-shaded.jar \
--project-root . --index
# 启动 MCP 服务器
java -jar target/java-code-indexer-*-shaded.jar --project-root .
```
## 它不是什么
- 不是代码执行沙箱
- 不是测试运行器或 linter
- 不能替代 LSP/IDE 功能
- 不是 AI 生成的摘要(符号提取是确定性的)
## License
[Apache License 2.0](LICENSE)
标签:AI辅助编程, JS文件枚举, MCP, SOC Prime, SQLite, 云安全监控, 代码索引, 域名枚举, 开发工具, 请求拦截, 静态分析