Peter Whip 是一个功能强大的 IntelliJ IDEA 插件,用于实时监控和管理 Maven、Gradle 和 Java 应用程序的进程。它能够自动捕获进程 ID、调整进程优先级(Windows),并提供便捷的进程查询接口。
- 🔍 自动进程监听:自动检测并记录 Maven、Gradle 和 Java 进程的启动和终止
- 🎯 PID 提取:精确提取每个进程的进程 ID (PID)
- ⚡ 优先级调整:在 Windows 系统上自动调整进程优先级以提升性能
- 📊 进程管理:线程安全的进程管理器,支持实时查询和监控
- 🔧 易于集成:提供简洁的 API 供其他插件或工具使用
- 🌐 广泛兼容:支持 IntelliJ IDEA 2023.3 及所有更高版本
- JDK 17 或更高版本
- IntelliJ IDEA 2023.3 或更高版本
- Gradle 7.0+
# 克隆仓库
git clone https://github.com/honwhy/peter-whip.git
cd peter-whip
# 构建插件
./gradlew buildPlugin构建完成后,插件包位于:build/distributions/peter-whip-1.0-SNAPSHOT.zip
- 打开 IntelliJ IDEA
- 进入
Settings/Preferences → Plugins - 点击齿轮图标,选择
Install Plugin from Disk... - 选择构建的 ZIP 文件并安装
- 重启 IDE
# 启动测试 IDE 实例
./gradlew runIde插件会自动监听以下类型的进程:
- 识别条件:命令行包含 "mvn"、"maven" 或 "org.apache.maven"
- 自动设置为高优先级(Windows)
- 记录启动时间、命令行、退出码等信息
- 识别条件:命令行包含 "gradle"、"org.gradle" 或 "gradlew"
- 自动设置为高优先级(Windows)
- 完整的进程生命周期跟踪
- 识别条件:命令行包含 "java"、"javaw"、"-jar"、"-cp" 等
- 区分 Run 模式和 Debug 模式
- Run 模式:高优先级;Debug 模式:正常优先级(Windows)
在 Windows 系统上,插件会自动使用 WMIC 命令调整进程优先级:
| 进程类型 | 模式 | 优先级 | 说明 |
|---|---|---|---|
| Maven | - | High (128) | 加速构建过程 |
| Gradle | - | High (128) | 加速构建过程 |
| Java | Run | High (128) | 提升运行性能 |
| Java | Debug | Normal (32) | 避免影响调试体验 |
import com.example.peterwhip.util.ProcessQueryUtil
val project = ... // 获取当前项目
// 获取所有活跃的 Maven 进程
val mavenProcesses = ProcessQueryUtil.getActiveMavenProcesses(project)
// 获取所有活跃的 Gradle 进程
val gradleProcesses = ProcessQueryUtil.getActiveGradleProcesses(project)
// 获取所有活跃的 Java 进程
val javaProcesses = ProcessQueryUtil.getActiveJavaProcesses(project)
// 获取所有活跃进程
val allProcesses = ProcessQueryUtil.getAllActiveProcesses(project)
// 根据 PID 查找进程
val process = ProcessQueryUtil.findProcessByPid(project, 12345L)
// 打印所有进程信息
ProcessQueryUtil.printAllProcesses(project)import com.example.peterwhip.manager.ProcessManager
val processManager = ProcessManager.getInstance(project)
// 获取特定类型的进程
val mavenProcesses = processManager.getActiveMavenProcesses()
val gradleProcesses = processManager.getActiveGradleProcesses()
val javaProcesses = processManager.getActiveJavaProcesses()
// 获取所有进程
val allProcesses = processManager.getAllActiveProcesses()每个进程包含以下详细信息:
data class ProcessInfo(
val pid: Long, // 进程 ID
val commandLine: String, // 完整命令行
val startTime: Long, // 启动时间戳
val isDebug: Boolean = false, // 是否为调试模式(仅 Java)
var exitCode: Int? = null, // 退出码(终止后)
var endTime: Long? = null // 终止时间戳(终止后)
)package com.example.peterwhip.action
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.example.peterwhip.util.ProcessQueryUtil
class ShowProcessesAction : AnAction() {
override fun actionPerformed(e: AnActionEvent) {
val project = e.project ?: return
ProcessQueryUtil.printAllProcesses(project)
}
}在 plugin.xml 中注册:
<actions>
<action id="ShowProcessesAction"
class="com.example.peterwhip.action.ShowProcessesAction"
text="Show Active Processes"
description="Show all active processes">
<add-to-group group-id="ToolsMenu" anchor="last"/>
</action>
</actions>import com.example.peterwhip.util.ProcessQueryUtil
val project = ... // 获取当前项目
// 为所有活跃的 Maven 进程设置高优先级
val successCount = ProcessQueryUtil.setAllMavenProcessesHighPriority(project)
println("Successfully adjusted $successCount processes")
// 为所有活跃的 Java 进程设置高优先级
val successCount = ProcessQueryUtil.setAllJavaProcessesHighPriority(project)
println("Successfully adjusted $successCount processes")import com.example.peterwhip.util.ProcessQueryUtil
val project = ... // 获取当前项目
val mavenProcesses = ProcessQueryUtil.getActiveMavenProcesses(project)
mavenProcesses.forEach { (pid, info) ->
println("Maven PID: $pid")
println("Command: ${info.commandLine}")
println("Started at: ${java.util.Date(info.startTime)}")
// 在这里添加自定义逻辑,如:
// - 监控 CPU/内存使用
// - 发送通知
// - 记录日志到文件
}你可以在监听器的回调方法中添加自定义业务逻辑:
在 MavenProcessListener.kt 中:
private fun handleMavenProcessStarted(pid: Long?, commandLine: String) {
// 你的自定义逻辑
// 例如:发送通知、保存到文件、调用外部 API 等
// 示例:保存进程信息到文件
val file = File("maven_processes.log")
file.appendText("${System.currentTimeMillis()},$pid,$commandLine\n")
// 示例:发送通知
NotificationGroupManager.getInstance()
.getNotificationGroup("PeterWhip")
.createNotification(
"Maven Build Started",
"PID: $pid",
NotificationType.INFORMATION
)
.notify(project)
}在 JavaProcessListener.kt 中:
private fun handleJavaProcessStarted(pid: Long?, commandLine: String, isDebug: Boolean) {
// 根据运行模式执行不同的逻辑
if (isDebug) {
println("Debug mode detected for PID: $pid")
// 调试模式的特殊处理
} else {
println("Run mode detected for PID: $pid")
// 运行模式的特殊处理
}
}src/main/kotlin/com/example/peterwhip/
├── listener/
│ ├── MavenProcessListener.kt # Maven 进程监听器
│ ├── GradleProcessListener.kt # Gradle 进程监听器
│ └── JavaProcessListener.kt # Java 进程监听器
├── manager/
│ └── ProcessManager.kt # 进程管理器(单例服务)
└── util/
├── ProcessQueryUtil.kt # 进程查询工具类
└── ProcessPriorityUtil.kt # 进程优先级工具类(Windows)
- 监听器层:使用
ProjectActivity和ExecutionListener监听进程事件 - 管理层:
ProcessManager提供线程安全的进程存储和查询 - 工具层:提供便捷的查询和优先级调整功能
- ExecutionListener:IntelliJ Platform 的执行监听机制
- ConcurrentHashMap:确保多线程环境下的数据安全
- WMIC:Windows Management Instrumentation Command-line(优先级调整)
- Process.pid():Java 9+ 的进程 ID 获取方法
所有进程数据存储在 ConcurrentHashMap 中,确保在并发环境下的安全性:
private val mavenProcesses = ConcurrentHashMap<Long, ProcessInfo>()
private val gradleProcesses = ConcurrentHashMap<Long, ProcessInfo>()
private val javaProcesses = ConcurrentHashMap<Long, ProcessInfo>()插件会在 IDE 控制台输出详细的日志信息:
[PeterWhip] Maven process started - PID: 12345
[PeterWhip] Command: mvn clean install
[ProcessManager] Registered Maven process: 12345
[PeterWhip] Maven process on Windows, adjusting priority...
[ProcessPriority] Setting priority for PID 12345 to 128
[ProcessPriority] Successfully set priority for PID 12345
[PeterWhip] Successfully set high priority for Maven process (PID: 12345)
[PeterWhip] Java process started - PID: 12346, Mode: Run
[PeterWhip] Command: java -jar myapp.jar
[ProcessManager] Registered Java process: 12346 (Run)
[PeterWhip] Java process (Run) on Windows, adjusting priority...
[ProcessPriority] Successfully set priority for PID 12346
[PeterWhip] Successfully set High priority for Java process (Run, PID: 12346)
[PeterWhip] Java process terminated - PID: 12346, Mode: Run, Exit code: 0
[ProcessManager] Unregistered Java process: 12346
- ✅ IntelliJ IDEA 2023.3 (Build 233) 及所有更高版本
- ✅ 自动支持未来发布的所有版本
- ✅ 包括最新的 2026.1 版本
- ✅ Windows:完整支持(包括优先级调整)
- ✅ macOS:支持进程监听(优先级调整不可用)
- ✅ Linux:支持进程监听(优先级调整不可用)
- 编译时:JDK 17
- 运行时:JDK 17+(由 IDE 提供)
intellijPlatform {
pluginConfiguration {
ideaVersion {
sinceBuild = "233" // 最低支持版本
// untilBuild 留空表示支持所有未来版本
}
}
}<idea-plugin>
<id>com.example.peter-whip</id>
<name>peter-whip</name>
<vendor url="https://www.yourcompany.com">YourCompany</vendor>
<depends>com.intellij.modules.platform</depends>
<depends>com.intellij.java</depends>
<extensions defaultExtensionNs="com.intellij">
<postStartupActivity implementation="com.example.peterwhip.listener.MavenProcessListener"/>
<postStartupActivity implementation="com.example.peterwhip.listener.GradleProcessListener"/>
<postStartupActivity implementation="com.example.peterwhip.listener.JavaProcessListener"/>
</extensions>
</idea-plugin>A: 请确认:
- 插件已正确安装并启用
- 项目已完全加载
- 确实运行了 Maven、Gradle 或 Java 程序
- 查看 IDE 的控制台输出
A:
- 确认是 Windows 系统
- 检查是否有足够的权限
- 验证 WMIC 命令是否可用:
wmic process where processid="1234" get priority - 查看错误日志获取详细信息
A: 创建新的监听器类,参考现有的 MavenProcessListener.kt 实现:
class CustomBuildToolListener : ProjectActivity {
override suspend fun execute(project: Project) {
// 实现监听逻辑
}
private fun isCustomProcess(commandLine: String): Boolean {
// 定义识别规则
return commandLine.contains("your-tool")
}
}A:
- 进程终止时会自动从活跃列表中移除(但保留历史记录)
- IDE 重启后所有信息都会清空
A: 可以!进程监听功能在所有平台都可用,只是优先级调整功能仅在 Windows 上有效。
欢迎贡献代码、报告问题或提出建议!
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
本项目采用 MIT 许可证 - 详见 LICENSE 文件
感谢 JetBrains 提供的优秀开发工具和平台支持!
Made with ❤️ by Your Team