Java JAR 探索器 MCP
一个模型上下文协议(MCP)服务器,提供全面的Java类分析和探索功能。该工具使AI助手能够检查Java类、分析依赖关系、搜索类,并从JAR文件和类路径中检索源代码。其功能包括方法级别的源代码提取、智能反编译和精确的代码边界检测。
实施原则
架构概述
Java JAR Explorer MCP 基于以下核心原则构建:
- MCP协议集成实现了模型上下文协议,以将Java分析能力作为标准化工具暴露出来,供AI助手使用。
- 异步处理使用Python的
asyncio对于非阻塞操作,尤其是当执行像(以下列举的)这样的外部Java工具时javap。
- 类路径感知分析自动检测并使用系统类路径,包括对自定义类路径的支持
JAVA_CLASSPATH环境变量。
- 多源类别发现支持从多个来源进行班级分析:
- JAR 文件(包括嵌套的 JAR 文件) - 基于目录的类文件 - JRT 文件系统(Java 9+ 模块系统) - 系统类路径
- 强大的错误处理实现了全面的错误处理机制,当工具或类不可用时,能够优雅降级。
核心组件
JavaClassViewer 类
负责处理的主要引擎是:
- 类路径解析与验证
- 使用(某种方法或工具)进行的阶级结构分析
javap - 源代码提取和反编译
- 方法级别的源代码提取,具备精确边界检测
- 依赖分析
- 跨多个来源进行班级搜索
数据模型
- 班级信息表示完整的类结构,包括字段、方法和构造函数
- 班级成员表示带有详细签名的类成员(字段、方法)
工具集成
- javap类分析和字节码检查的主要工具
- 罐子用于从JAR存档中提取源文件
- Java用于类路径检测和验证
高级功能
- 方法级分析提取并分析单个方法的源代码
- 智能源检测自动检测原始代码与反编译后的源代码
- 行级精确提取用于代码清理的精确方法边界检测
- 签名分析可选的方法签名包含,以提供更好的上下文
快速入门
1. 克隆并设置
首先,克隆此仓库并安装所需的依赖项:
# Clone the repository
git clone https://github.com/zksite/java-class-view-mcp
cd java-class-view-mcp
# Install Python dependencies
pip install -r requirements.txt2. MCP配置
要使用此MCP服务器,请在您的MCP客户端中添加以下配置:
{
"java-jar-explorer": {
"command": "python",
"args": ["java-class-viewer.py"],
"env": {
"MAVEN_HOME": "",
"JAVA_HOME": "",
"JAVA_CLASSPATH": ""
}
}
}环境变量配置
- MAVEN_HOME(注:在中文语境中,我们通常不直接翻译变量名,而是保留其原样,但可以解释其含义为“Maven 安装目录”或“Maven 主目录”,不过在这里直接给出翻译形式,即“MAVEN_家目录”并不准确,因此保持原样更为合适。)Maven 安装路径(可选)
- JAVA_HOMEJava 安装路径(必需)
- JAVA_CLASSPATH(Java类路径)用于分析的自定义类路径(可选,如果未指定,将使用系统类路径)
示例配置
{
"java-jar-explorer": {
"command": "python",
"args": ["java-class-viewer.py"],
"env": {
"MAVEN_HOME": "C:\\Program Files\\Apache\\maven",
"JAVA_HOME": "C:\\Program Files\\Java\\jdk-17",
"JAVA_CLASSPATH": "C:\\myproject\\target\\classes;C:\\myproject\\lib\\*.jar"
}
}
}可用工具
MCP服务器为AI助手提供了以下工具:
1. 查看类结构
目的获取Java类的完整结构信息
参数:
class_name(字符串):完整限定类名(例如,'java.lang.String')
退货详细的班级结构,包括:
- 类元数据(名称、包、修饰符、类型)
- 带有类型和修饰符的字段
- 带有签名和参数的方法
- 构造函数
- 继承关系
- 内部类
2. 搜索类别
目的搜索符合特定模式的Java类
参数:
pattern(字符串):搜索模式(支持通配符和正则表达式)search_type(字符串):搜索类型 - "名称", "包", "方法", "字段"limit(整数):最大结果数量(默认:20)
回报包含位置信息的匹配班级列表
3. 分析类依赖关系
目的分析一个类的依赖关系
参数:
class_name(字符串):完全限定类名depth(整数):分析深度(1=直接依赖项,2=二级,依此类推)
退货显示类关系的依赖树
4. 查找类的使用情况
目的在代码库中查找某个类的使用位置
参数:
class_name(字符串):完全限定类名search_scope(字符串): 搜索范围 - "classpath"(类路径)、"jar"(JAR文件)、"directory"(目录)
退货类被引用的地点列表
5. 获取类层次结构
目的获取类的继承层次结构信息
参数:
class_name(字符串):完整类名
退货继承树显示:
- 父类
- 实现了的接口
- 类类型(类、接口、枚举、注解)
6. 查找类位置
目的确定类文件的物理位置
参数:
class_name(字符串):完全限定类名
回报包含类文件的JAR文件或目录的路径
7. 获取类源码
目的获取类的源代码
参数:
class_name(字符串):完全限定类名decompile(boolean): 如果源代码不可用时是否进行反编译(默认:true)
退货带有元数据的源代码:
- 原始来源(如果JAR文件中存在)
- 反编译后的源代码(使用javap)
- 来源类型和位置信息
8. 获取类的字节码
目的获取类的详细字节码信息
参数:
class_name(字符串):完整类名
回报\javap\ 产生的详细字节码输出,包括:
- 常量池
- 方法字节码
- 现场信息
- 类元数据
9. 获取方法源码
目的从Java类中提取特定方法的源代码
参数:
class_name(字符串):完全限定类名method_name(字符串):提取方法的名称include_signature(布尔值):是否包含方法签名(默认:false)
退货方法源代码信息包括:
- 方法源代码
- 方法签名(如需)
- 行号和位置信息
- 源类型(原始或反编译)
10. 获取类路径信息
目的获取当前的类路径配置和统计信息
参数无
退货全面的类路径信息:
- 环境变量(JAVA_CLASSPATH,JAVA_HOME)
- 当前有效的类路径
- 统计信息(JAR文件数量、目录数量、无效路径)
- 详细路径分解
使用示例
基本阶级分析
# Get structure of a specific class
result = await view_class_structure("java.util.ArrayList")
# Search for classes by name pattern
results = await search_classes("*List*", "name", 10)依赖分析
# Analyze direct dependencies
deps = await analyze_class_dependencies("com.example.MyClass", 1)
# Find where a class is used
usages = await find_class_usages("java.util.List", "classpath")源代码检索
# Get complete class source code (with decompilation fallback)
source = await get_class_source("com.example.MyClass", True)
# Get specific method source code
method_source = await get_method_source("com.example.MyClass", "methodName", True)
# Get bytecode for detailed analysis
bytecode = await get_class_bytecode("com.example.MyClass")配置
环境变量
JAVA_HOMEJava安装路径JAVA_CLASSPATH自定义类路径(可选,覆盖系统类路径)
要求
- Java 8或更高版本
- Python 3.7及以上版本
javap路径中可用的工具- 访问目标JAR文件和类路径
错误处理
该工具实现了强大的错误处理机制:
- 当Java工具不可用时的优雅降级
- 对于缺失的类或无效的类路径,提供清晰的错误信息
- 源代码检索的备用机制
- 输入参数和类路径条目的验证
性能考量
- 异步操作可防止在长时间分析过程中发生阻塞
- 类路径缓存减少了重复的文件系统操作
- 可配置的搜索限制避免结果过多
- 使用zipfile操作进行高效的JAR扫描
这款MCP服务器使AI助手能够执行复杂的Java代码库分析,从而更轻松地理解复杂的Java应用程序、分析依赖关系,并通过编程方式探索类之间的关系。
