docs(guidelines): 更新编码指南并添加工作日志和开发工具文档

- 简化 AGENTS.md 文档结构,更新构建命令和代码风格指南
- 新增 2026 年 1 月工作日志记录项目进展和问题解决
- 添加 Cursor 连接 WSL 开发完整教程,涵盖环境配置和最佳实践
- 创建 SDKMAN Java 和 Maven 版本管理指南,支持多项目环境
- 编写 Windows Jabba Java 版本管理文档,提供 PowerShell 集成方案
This commit is contained in:
liumangmang
2026-02-04 10:55:36 +08:00
parent 6d05134161
commit caae9fb69b
6 changed files with 1387 additions and 146 deletions

233
AGENTS.md
View File

@@ -1,218 +1,159 @@
# AGENTS.md - MyBlog 编码指南
本文档为在此 VuePress 博客项目中工作的智能编码助手提供指南。
AI 智能助手在此 VuePress 博客项目中工作指南。
## 项目概述
这是一个基于以下技术构建的个人博客:
- **框架**: VuePress v2 (静态站点生成器)
- **框架**: VuePress v2静态站点生成器
- **主题**: VuePress Theme Hope
- **语言**: TypeScript + Vue 3
- **构建工具**: Vite
- **包管理器**: npm
## 构建/代码检查/测试命令
## 构建命令
### 开发
```bash
# 启动开发服务器
npm run docs:dev
# 开发
npm run docs:dev # 启动开发服务器
npm run docs:clean-dev # 清除缓存后启动
# 清除缓存后启动开发服务器
npm run docs:clean-dev
# 构建与部署
npm run docs:build # 生产构建
# 构建生产版本
npm run docs:build
# 维护
npm run docs:update-package # 更新 VuePress 包
npm run update:browsers # 更新 browserslist
# 更新 VuePress 包
npm run docs:update-package
# 更新 browserslist 数据库
npm run update:browsers
# 类型检查
npx tsc --noEmit # TypeScript 检查
```
### 测试与质量
本项目没有配置显式的测试命令。由于是 VuePress 博客:
- package.json 中没有配置单元测试
- 通过 `npm run docs:build` 进行构建验证
- 通过 `npm run docs:dev` 进行开发服务器验证
## 文件结构
### 类型检查
```bash
# TypeScript 类型检查(如果需要)
npx tsc --noEmit
```
## 代码风格指南
### 文件结构
```
src/
├── .vuepress/ # VuePress 配置
├── .vuepress/
│ ├── config.ts # 站点配置
│ ├── theme.ts # 主题配置
│ ├── navbar.ts # 导航配置
│ ├── navbar.ts # 导航配置
│ ├── sidebar.ts # 侧边栏配置
│ ├── styles/ # 自定义样式
│ ├── styles/ # 自定义 SCSS
│ └── components/ # Vue 组件
├── programming/ # 编程相关文章
├── programming/ # 编程文章
├── apps/ # 应用部署指南
├── tools/ # 工具分享
├── work/ # 工作日志
└── README.md # 首页
```
### TypeScript 配置
- **模块系统**: ES 模块 (package.json 中的 `"type": "module"`)
- **目标版本**: ES2022
- **模块解析**: NodeNext
- **包含文件**: `src/.vuepress/**/*.ts``src/.vuepress/**/*.vue`
## 代码风格
### 导入语句
- 使用 ES 模块导入: `import { defineUserConfig } from "vuepress";`
- 需要时显式导入类型
- 分组导入:框架导入在前,本地导入在后
- 使用 config.ts 中定义的路径别名(如果可用)
### TypeScript
- **模块**: ES 模块(`"type": "module"`
- **目标**: ES2022
- **解析**: NodeNext
- 函数参数和返回值使用显式类型
- 复杂数据结构使用接口
### TypeScript 使用
- 所有配置文件都使用 TypeScript
- 为函数参数和返回值定义显式类型
- 对复杂数据结构使用接口
- 结合 TypeScript 使用 Vue 3 的 Composition API
### 导入
- 使用 ES 模块:`import { defineUserConfig } from "vuepress"`
- 分组导入:框架优先,本地其次
- 使用 config.ts 中定义的路径别名
### Vue 组件
- 使用 Vue 3 Composition API 和 `<script setup>` 语法
- 使用 Vue 3 Composition API 和 `<script setup>`
- 使用 TypeScript 接口定义 props
- 使用 `ref()``reactive()` 处理响应式状态
- 遵循现有组件的 VuePress 组件模式
- 使用 `ref()``reactive()` 管理状态
- 自定义组件放在 `src/.vuepress/components/`
### Markdown 文件
- 使用 YAML frontmatter 存储元数据
### Markdown
- 使用 YAML frontmatter
```yaml
---
title: 文章标题
icon: simple-icons:iconname
date: YYYY-MM-DD
category:
- 分类名称
- 分类
tag:
- 标签1
- 标签2
---
```
- 包含 `<!-- more -->` 标签作为文章摘要
- 使用中文内容 (zh-CN)
- 遵循现有文章结构,包含清晰的章节
- 包含 `<!-- more -->` 作为摘要
- 内容使用中文zh-CN
### 命名约定
- **文件**: Markdown 文件使用 kebab-caseVue 组件使用 PascalCase
- **文件**: Markdown 使用 kebab-caseVue 使用 PascalCase
- **变量**: camelCase
- **常量**: UPPER_SNAKE_CASE
- **函数**: camelCase描述性名称
- **函数**: camelCase描述性名称
- **类型/接口**: PascalCase
- **目录**: kebab-case
### 格式化
- **缩进**: 2 个空格
- **行长度**: 80-100 字符
- **分号**: 必需
- **引号**: 字符串使用单引号,模板使用反引号
- **尾随逗号**: 多行时使用
### CSS/SCSS
- 使用 SCSS已安装 sass-embedded
- 自定义类遵循 BEM 命名
- 使用 CSS 变量进行主题化
### 错误处理
- 异步操作使用 try-catch
- 异步操作使用 try-catch
- 验证配置对象
- 提供有意义的错误信息
- 适当记录错误(开发时使用 console.error
- 使用 console.error 进行调试
### 格式化
- **缩进**: 2 个空格(不使用制表符)
- **行长度**: 目标 80-100 个字符
- **分号**: 使用分号
- **引号**: 字符串使用单引号,模板字面量使用反引号
- **尾随逗号**: 在多行对象和数组中使用
## Git 实践
### CSS/样
- 使用 SCSS 进行自定义样式(已安装 sass-embedded
- 自定义类遵循 BEM 命名约定
- 使用 CSS 自定义属性(变量)进行主题化
- 利用 VuePress Theme Hope 的内置样式
- **提交**: 约定式提交格
- **分支**: feature/描述、fix/描述、docs/描述
### Git 实践
- **提交消息**: 使用约定式提交格式
- **分支命名**: feature/描述, fix/描述, docs/描述
- **.gitignore**: 已配置为忽略 node_modules、dist、缓存文件
## 智能助手指令
### 配置文件
- **config.ts**: 主要 VuePress 配置
- **theme.ts**: 主题自定义
- **navbar.ts**: 导航结构
- **sidebar.ts**: 侧边栏组织
- 遵循这些文件中的现有模式
### 性能考虑
- 优化 `src/.vuepress/public/` 中的图片
- 对图片使用懒加载 (`imgLazyload: true`)
- 通过仅导入所需组件来最小化打包大小
- 使用 VuePress 内置优化
### 可访问性
- 使用语义化 HTML 元素
- 为图片提供 alt 文本
- 确保正确的标题层级
- 保持键盘导航支持
### 国际化
- 主要语言: 中文 (zh-CN)
- 在 `config.ts` 中配置: `lang: "zh-CN"`
- 所有面向用户的内容使用中文
- 保持一致的术语
### 部署
- 构建输出: `src/.vuepress/dist/`
- 兼容静态托管
- 如果需要,在 `config.ts` 中配置基础路径
- 确保所有相对路径正常工作
## 智能助手特定指令
1. **修改前**: 始终运行 `npm run docs:dev` 验证更改是否有效
2. **修改后**: 运行 `npm run docs:build` 确保生产构建成功
3. **添加文章时**: 遵循现有的 frontmatter 和结构模式
4. **修改配置时**: 检查现有配置文件中的模式
5. **创建组件时**: 放置在 `src/.vuepress/components/` 并遵循 Vue 3 模式
6. **更新依赖时**: 使用 `npm run docs:update-package` 更新 VuePress 包
1. **修改前**: 运行 `npm run docs:dev` 验证
2. **修改后**: 运行 `npm run docs:build` 确保构建成功
3. **新文章**: 遵循现有 frontmatter 模式
4. **配置修改**: 检查现有配置模式
5. **新组件**: 使用 Vue 3 模式,放在 components/ 目录
6. **依赖更新**: 使用 `npm run docs:update-package`
## 常见任务
### 添加新文章
1. 在适当目录创建 Markdown 文件
1. 在适当目录创建 Markdown 文件
2. 添加包含标题、日期、分类、标签的 YAML frontmatter
3. 编写包含清晰章节标题的内容
4. 包含 `<!-- more -->` 标签作为摘要
5. 如果需要,添加到侧边栏配置
### 修改主题
1. 编辑 `src/.vuepress/theme.ts`
2. 查阅 VuePress Theme Hope 文档
3. 在开发模式下测试更改
4. 验证生产构建
3. 编写包含清晰标题的内容
4. 包含 `<!-- more -->` 摘要标记
5. 如需则更新 sidebar.ts
### 添加自定义组件
1. 在 `src/.vuepress/components/` 创建 Vue 组件
2. 如果需要,在配置中注册
3. 在 Markdown 或其他组件中导入使用
4. 在开发测试
### 更新导航
1. 编辑 `src/.vuepress/navbar.ts`
2. 遵循现有结构
3. 测试导航功能
4. 验证移动端响应性
1. 在 `src/.vuepress/components/` 创建
2. 如需则在配置中注册
3. 在 Markdown/组件中导入使用
4. 在开发模式测试
## 故障排除
### 常见问题
- **构建失败**: 检查 TypeScript 错误、缺失的依赖
- **开发服务器无法启动**: 尝试 `npm run docs:clean-dev`
- **图片无法加载**: 验证 `public/` 目录中的路径
- **样式未应用**: 检查 SCSS 编译、导入顺序
- **构建失败**: 检查 TypeScript 错误、缺失依赖
- **开发服务器失败**: 尝试 `npm run docs:clean-dev`
- **图片无法加载**: 验证 `public/` 目录路径
- **样式未应用**: 检查 SCSS 编译顺序
### 调试
1. 检查浏览器控制台中的错误
2. 验证终端中的 VuePress 日志
3. 在开发者工具中检查生成的 HTML
4. 如果需要,使用干净缓存测试
## 部署
- **输出目录**: `src/.vuepress/dist/`
- **托管**: 兼容静态托管
- **基础路径**: 如需则在 `config.ts` 中配置
## 注意事项
- 未配置单元测试(仅构建验证)
- 主要语言中文zh-CN
- 主题VuePress Theme Hope 自定义
- 图标FontAwesome 6`fa6-solid:` 前缀)

View File

@@ -0,0 +1,270 @@
---
title: 使用 SDKMAN 管理 Java 和 Maven 多版本
icon: mdi:package-variant
date: 2026-02-04
category:
- 实用工具
- JAVA
tag:
- SDKMAN
- Java
- Maven
- 版本管理
---
# 使用 SDKMAN 管理 Java 和 Maven 多版本方案
在开发过程中,我们经常需要在不同的项目之间切换不同的 Java 和 Maven 版本。SDKMAN (Software Development Kit Manager) 是一个强大的工具,可以帮助我们轻松管理多个版本的软件开发工具包。
<!-- more -->
## 概述
在开发过程中,我们经常需要在不同的项目之间切换不同的 Java 和 Maven 版本。SDKMAN (Software Development Kit Manager) 是一个强大的工具,可以帮助我们轻松管理多个版本的软件开发工具包。
## 当前系统环境
- **操作系统**: Linux
- **当前 Java 版本**: OpenJDK 1.8.0_472 (Java 8)
- **当前 Maven 版本**: Apache Maven 3.8.7
- **SDKMAN 状态**: 需要安装
## 安装 SDKMAN
### 1. 下载并安装 SDKMAN
```bash
curl -s "https://get.sdkman.io" | bash
```
### 2. 初始化 SDKMAN
```bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
```
### 3. 验证安装
```bash
sdk version
```
## 管理 Java 版本
### 1. 查看可用的 Java 版本
```bash
sdk list java
```
### 2. 安装特定版本的 Java
```bash
# 安装 Java 11
sdk install java 11.0.21-tem
# 安装 Java 17 (LTS)
sdk install java 17.0.9-tem
# 安装 Java 21 (最新 LTS)
sdk install java 21.0.1-tem
# 安装 OpenJDK 版本
sdk install java 8.0.382-tem
```
### 3. 切换 Java 版本
```bash
# 临时切换到 Java 11
sdk use java 11.0.21-tem
# 临时切换到 Java 17
sdk use java 17.0.9-tem
```
### 4. 设置默认 Java 版本
```bash
sdk default java 17.0.9-tem
```
### 5. 查看当前使用的 Java 版本
```bash
sdk current java
java -version
```
## 管理 Maven 版本
### 1. 查看可用的 Maven 版本
```bash
sdk list maven
```
### 2. 安装特定版本的 Maven
```bash
# 安装 Maven 3.8.x
sdk install maven 3.8.8
# 安装 Maven 3.9.x
sdk install maven 3.9.6
```
### 3. 切换 Maven 版本
```bash
sdk use maven 3.9.6
```
### 4. 设置默认 Maven 版本
```bash
sdk default maven 3.9.6
```
### 5. 查看当前使用的 Maven 版本
```bash
sdk current maven
mvn -version
```
## 项目级版本管理
SDKMAN 支持项目级别的版本管理,通过 `.sdkmanrc` 文件可以实现进入项目目录时自动切换到指定版本。
### 1. 创建项目版本配置文件
```bash
# 在项目根目录创建 .sdkmanrc 文件
cat > .sdkmanrc << EOF
java=17.0.9-tem
maven=3.9.6
EOF
```
### 2. 启用项目版本环境
```bash
# 进入项目目录
cd your-project
# 激活项目配置的版本
sdk env
```
### 3. 自动切换(可选)
SDKMAN 可以配置为在进入包含 `.sdkmanrc` 文件的目录时自动切换版本。
```bash
# 启用自动切换
sdk enable auto_env
```
## 常用 SDKMAN 命令
### 1. 查看所有已安装的版本
```bash
sdk list installed
```
### 2. 查看特定工具的所有版本
```bash
sdk list java
sdk list maven
```
### 3. 卸载不需要的版本
```bash
# 卸载 Java 11
sdk uninstall java 11.0.21-tem
# 卸载 Maven 3.8.8
sdk uninstall maven 3.8.8
```
### 4. 更新 SDKMAN
```bash
sdk selfupdate
```
### 5. 查看帮助
```bash
sdk help
```
## 实际使用场景示例
### 场景 1新项目使用 Java 17 + Maven 3.9
```bash
cd new-project
sdk use java 17.0.9-tem
sdk use maven 3.9.6
echo "java=17.0.9-tem" > .sdkmanrc
echo "maven=3.9.6" >> .sdkmanrc
```
### 场景 2维护旧项目使用 Java 8 + Maven 3.8
```bash
cd legacy-project
sdk use java 8.0.382-tem
sdk use maven 3.8.8
echo "java=8.0.382-tem" > .sdkmanrc
echo "maven=3.8.8" >> .sdkmanrc
```
### 场景 3升级项目 Java 版本
```bash
cd project-to-upgrade
# 从 Java 8 升级到 Java 17
sdk install java 17.0.9-tem
sdk use java 17.0.9-tem
# 更新 .sdkmanrc 文件
sed -i 's/java=.*/java=17.0.9-tem/' .sdkmanrc
```
## 最佳实践建议
1. **保持系统 Java 版本最低**: 系统级别的 Java 保持为较低版本(如 Java 8其他版本通过 SDKMAN 管理。
2. **项目配置版本控制**: 将 `.sdkmanrc` 文件提交到版本控制系统,确保团队成员使用一致的开发环境。
3. **定期清理不需要的版本**: 定期使用 `sdk list installed` 查看已安装版本,卸载不再使用的版本以节省磁盘空间。
4. **文档化版本要求**: 在项目 README 文件中明确说明所需的 Java 和 Maven 版本。
5. **测试环境一致性**: 开发、测试、生产环境尽量保持相同的版本配置。
## 环境变量配置
如果需要永久配置环境变量,可以在 `~/.bashrc``~/.zshrc` 中添加:
```bash
# SDKMAN 初始化
export SDKMAN_DIR="$HOME/.sdkman"
[[ -s "$SDKMAN_DIR/bin/sdkman-init.sh" ]] && source "$SDKMAN_DIR/bin/sdkman-init.sh"
```
## 总结
SDKMAN 提供了一个优雅的解决方案来管理 Java 和 Maven 的多版本问题。通过合理使用 SDKMAN我们可以
- 轻松在不同项目间切换版本
- 避免版本冲突问题
- 简化团队成员的环境配置
- 提高开发效率和项目维护性
建议所有需要处理多版本 Java 项目的开发者都使用 SDKMAN 进行版本管理。

View File

@@ -0,0 +1,405 @@
---
title: Windows 多版本 Java 环境管理Jabba
icon: mdi:language-java
date: 2026-02-04
category:
- 实用工具
- JAVA
tag:
- Jabba
- Java
- Windows
- 版本管理
- PowerShell
---
# Windows 多版本 Java 环境管理Jabba
在 Windows 10 + PowerShell 环境下使用 Jabba 实现多版本 JDK 管理的完整指南。
<!-- more -->
## 1. 环境及目录约定
- **操作系统**: Windows 10
- **Shell**: PowerShell
- **Jabba 安装目录**(手动方式):
- 二进制: `C:\Users\<用户名>\.jabba\bin\jabba.exe`
- 脚本: `C:\Users\<用户名>\.jabba\jabba.ps1`
- **本项目目录**(当前目录):
- `C:\Users\<用户名>\Desktop\cursor\JAVA 版本管理`
- 内含辅助脚本,例如 `use-java.ps1`、本说明文件 `JAVA_ENV_SETUP.md`
> 下文中的 `<用户名>` 对应你本机的 Windows 用户名,例如 `a3621`。
---
## 2. Jabba 手动安装与集成
### 2.1 放置 Jabba 可执行文件
1. 使用浏览器下载 Jabba Windows 版本(例如 `jabba-0.14.0-windows-amd64.exe`)。
2. 在资源管理器中创建目录:
- `C:\Users\<用户名>\.jabba\bin\`
3. 将下载的 EXE 重命名为:
- `jabba.exe`
4. 移动到:
- `C:\Users\<用户名>\.jabba\bin\jabba.exe`
### 2.2 创建 `jabba.ps1` 包装脚本
1. 打开 PowerShell执行:
```powershell
notepad "$env:USERPROFILE\.jabba\jabba.ps1"
```
2. 在文件中填入如下内容(如已存在可覆盖):
```powershell
$env:JABBA_HOME="$env:USERPROFILE\.jabba"
function jabba
{
$fd3=$([System.IO.Path]::GetTempFileName())
$command="& '$env:JABBA_HOME\bin\jabba.exe' $args --fd3 `"$fd3`""
& { $env:JABBA_SHELL_INTEGRATION="ON"; Invoke-Expression $command }
$fd3content=$(Get-Content $fd3)
if ($fd3content) {
$expression=$fd3content.replace("export ","`$env:").replace("unset ","Remove-Item env:") -join "`n"
if (-not $expression -eq "") { Invoke-Expression $expression }
}
Remove-Item -Force $fd3
}
```
3. 保存并关闭记事本。
### 2.3 在 PowerShell Profile 中自动加载 Jabba
1. 打开 PowerShell Profile:
```powershell
notepad $PROFILE
```
2. 在文件末尾追加(若已有同类行则无需重复):
```powershell
if (Test-Path "$env:USERPROFILE\.jabba\jabba.ps1") { . "$env:USERPROFILE\.jabba\jabba.ps1" }
```
3. 保存,关闭 PowerShell 窗口,重新打开一个新的 PowerShell。
4. 验证:
```powershell
jabba --version
```
若能输出版本号(例如 `0.14.0`),说明 Jabba 配置成功。
---
## 3. 使用 Jabba 管理多版本 JDK
### 3.1 查看可用 JDK 版本
```powershell
jabba ls-remote
jabba ls-remote temurin
```
### 3.2 安装常用 LTS 版本(示例: 8 / 11 / 17
```powershell
jabba install temurin@17
jabba install temurin@11
jabba install temurin@8
```
安装完成后查看本机已安装的 JDK 列表:
```powershell
jabba ls
```
### 3.3 在当前终端会话切换 JDK 版本
```powershell
jabba use temurin@17
java -version
```
`java -version` 应显示对应版本(例如 `openjdk version "17.x.y"`)。
---
## 4. 配置"全局默认" JDK 版本
若希望每次打开 PowerShell 都默认使用某个版本(例如 17可在 Profile 中配置:
1. 在任意 PowerShell 会话中确认要用的版本,例如:
```powershell
jabba use temurin@17
```
2. 打开 Profile:
```powershell
notepad $PROFILE
```
3. 在末尾追加:
```powershell
jabba use temurin@17
```
4. 保存并重启 PowerShell验证:
```powershell
java -version
```
此时新开终端应默认是 JDK 17。
---
## 5. 项目级 Java 版本管理(`.jabbarc` + `use-java.ps1`
### 5.1 `.jabbarc` 约定
在每个 Java 项目根目录创建 `.jabbarc` 文件,内容为希望使用的 Jabba 版本,例如:
```text
temurin@17
```
老项目如需 Java 8:
```text
temurin@8
```
> 规则: `.jabbarc` 第一行非空内容即为要使用的版本字符串,与 `jabba ls` 中的名称一致。
### 5.2 通用脚本 `use-java.ps1`
在当前目录 `JAVA 版本管理` 下建议放一个通用脚本 `use-java.ps1`,典型实现如下:
```powershell
param(
[string]$ProjectPath = "."
)
$fullPath = (Resolve-Path $ProjectPath).Path
$jabbarc = Join-Path $fullPath ".jabbarc"
if (!(Test-Path $jabbarc)) {
Write-Host "未找到 .jabbarc 文件:$jabbarc"
exit 1
}
$version = (Get-Content $jabbarc | Where-Object { $_ -ne "" } | Select-Object -First 1).Trim()
if (-not $version) {
Write-Host ".jabbarc 里没有有效版本号"
exit 1
}
Write-Host "切换到 JDK 版本:$version"
jabba use $version
Write-Host "当前 java 版本:"
java -version
```
> 实际脚本内容可根据需要微调,只要遵循"读取 `.jabbarc` → 调用 `jabba use`"的逻辑即可。
### 5.3 使用方式示例
假设有项目 `D:\Projects\MyApp`,根目录已放置 `.jabbarc`:
```powershell
cd "D:\Projects\MyApp"
# 从当前目录调用公共脚本(路径根据实际情况调整)
powershell -ExecutionPolicy Bypass -File "C:\Users\<用户名>\Desktop\cursor\JAVA 版本管理\use-java.ps1" .
```
执行后,当前终端的 `JAVA_HOME` 和 `PATH` 将切换到 `.jabbarc` 指定的 JDK随后在该终端内运行的 `java` / `javac` / `mvn` / `gradlew` 都会使用这个版本。
### 5.4 进阶cd 自动检测 `.jabbarc`(类似 direnv
若希望**一进入带 `.jabbarc` 的目录就自动切换 JDK**,无需再手动执行 `use-java.ps1`,可在 PowerShell Profile 中增加下面逻辑。
**行为说明:**
- 每次执行 `cd`(或 `Set-Location`)后,从当前目录向上逐级查找 `.jabbarc`。
- 找到则读取其中版本并执行 `jabba use <版本>`,当前终端即使用该 JDK。
- 若当前路径及所有父目录都没有 `.jabbarc`,不修改 JDK保持上一次的版本
**实现步骤:**
1. 打开 Profile
```powershell
notepad $PROFILE
```
2. 在**已加载 Jabba 的语句之后**(例如在 `jabba use temurin@17` 之后),追加下面整段代码并保存:
```powershell
# ----- 自动根据 .jabbarc 切换 JDKdirenv 风格) -----
function Invoke-JabbaAutoUse {
$current = Get-Location
while ($current -and $current.Path) {
$jabbarc = Join-Path $current.Path ".jabbarc"
if (Test-Path -LiteralPath $jabbarc -PathType Leaf) {
$version = (Get-Content -LiteralPath $jabbarc -Raw -ErrorAction SilentlyContinue).Trim()
$version = ($version -split "`n" | ForEach-Object { $_.Trim() } | Where-Object { $_ -ne "" } | Select-Object -First 1)
if ($version) {
jabba use $version 2>$null
}
return
}
$parent = Split-Path $current.Path -Parent
if (-not $parent -or $parent -eq $current.Path) { break }
$current = Get-Item -LiteralPath $parent -ErrorAction SilentlyContinue
}
}
# 用包装函数替代内置 cd使每次切换目录后自动检测 .jabbarc
function Set-LocationWithJabba {
[CmdletBinding(DefaultParameterSetName = "Path")]
param(
[Parameter(ParameterSetName = "Path", Position = 0)]
[string]$Path,
[Parameter(ParameterSetName = "LiteralPath")]
[string]$LiteralPath,
[switch]$PassThru
)
if ($PSCmdlet.ParameterSetName -eq "LiteralPath" -and $LiteralPath) {
Set-Location -LiteralPath $LiteralPath
} elseif ($Path) {
Set-Location -Path $Path
} else {
Set-Location $env:USERPROFILE
}
if ($PassThru) { Get-Location }
Invoke-JabbaAutoUse
}
Set-Alias -Name cd -Value Set-LocationWithJabba -Force -Option AllScope
# ----- 以上为自动 .jabbarc 检测 -----
```
3. 关闭并重新打开 PowerShell使 Profile 生效。
**使用方式:**
```powershell
cd D:\Projects\MyApp # 若 MyApp 或其父目录有 .jabbarc会自动 jabba use
java -version # 已是 .jabbarc 中指定的版本
```
**注意:**
- 仅对**当前会话**中通过 `cd` 的切换生效;新开终端仍会先应用 Profile 里的默认 `jabba use`,再在第一次 `cd` 到带 `.jabbarc` 的目录时自动切换。
- 若使用 `Set-Location`(或 `sl`)切换目录,不会触发自动检测;可在切换后手动执行 `Invoke-JabbaAutoUse``use-java.ps1`
- 若不需要自动检测,可删除 Profile 中上述整段"自动 .jabbarc 检测"代码,继续使用手动执行 `use-java.ps1` 的方式。
---
## 6. Maven / Gradle 与 JDK 版本
### 6.1 Maven
在执行 Maven 命令前,通过 Jabba 或 `use-java.ps1` 先切好版本:
```powershell
jabba use temurin@17 # 或 use-java.ps1 ...
mvn -version # 确认使用的 JAVA_HOME
mvn clean package
```
- Maven 默认读取当前会话的 `JAVA_HOME` / `PATH`,无需额外配置。
### 6.2 Gradle / Gradle Wrapper
同样原则,先设置好 JDK:
```powershell
jabba use temurin@11
.\gradlew -version
.\gradlew build
```
如需强制某项目永远使用固定 JDK可在该项目 `gradle.properties` 中加入:
```properties
org.gradle.java.home=C:/Users/<用户名>/.jabba/jdk/temurin@17.0.10
```
> 注意路径需要与 `jabba ls` 列出的真实 JDK 目录一致。
---
## 7. IDE 中使用 Jabba 管理的 JDK
### 7.1 IntelliJ IDEA
1. 打开 `File -> Project Structure -> SDKs`
2. 点击 `+` 添加 JDK路径指向 Jabba 安装的 JDK例如:
- `C:\Users\<用户名>\.jabba\jdk\temurin@17.0.10`
3.`Project` 中为每个项目选择对应 SDKJDK 8 / 11 / 17 等)。
4. 在 IDEA 内置 Terminal 中使用 PowerShell可继承前述 Jabba 环境。
### 7.2 Eclipse
1. 打开 `Window -> Preferences -> Java -> Installed JREs`
2. 添加 JRE路径为 Jabba 的 JDK 目录,例如:
- `C:\Users\<用户名>\.jabba\jdk\temurin@11.0.x`
3. 在工作空间或项目属性中为不同项目选择不同 JRE。
### 7.3 VS CodeJava 扩展)
在对应工程的 `settings.json` 中配置:
```json
{
"java.jdt.ls.java.home": "C:/Users/<用户名>/.jabba/jdk/temurin@17.0.10"
}
```
不同 Workspace 可指向不同 JDK实现按项目区分。
---
## 8. 备份与迁移建议
为方便重装系统或迁移到新电脑,建议备份以下内容:
- PowerShell Profile:
- `$PROFILE` 对应的文件(路径可通过 `echo $PROFILE` 查看)。
- Jabba 相关:
- `C:\Users\<用户名>\.jabba\bin\jabba.exe`
- `C:\Users\<用户名>\.jabba\jabba.ps1`
- 本目录下配置:
- `JAVA_ENV_SETUP.md`(本说明文件)
- `use-java.ps1`(项目级切换脚本)
- 各个项目中的 `.jabbarc` 文件(记录各项目所需的 JDK 版本)。
迁移步骤简化为:
1. 将上述文件拷贝到新机器相同位置。
2. 打开 PowerShell确认 Profile 中有 Jabba 加载语句。
3. 重新打开 PowerShell执行 `jabba --version` 验证。
4. 根据需要使用 `jabba install` 重新拉取各版本 JDK或同时备份 `.jabba\jdk` 目录)。
---
通过上述配置,你即可在 Windows 10 上实现:
- 全局默认 JDK 版本(通过 Profile 中的 `jabba use`)。
- 项目级 JDK 版本(通过 `.jabbarc` + `use-java.ps1`)。
- 构建工具与 IDE 均能根据当前环境/配置选择合适的 JDK。

View File

@@ -0,0 +1,328 @@
---
title: Cursor 连接 WSL 开发指南
icon: mdi:microsoft-windows
date: 2026-02-04
category:
- 开发工具
- 前端
tag:
- Cursor
- WSL
- Windows
- 开发环境
---
# Cursor 连接 WSL 开发指南
本指南包含 Windows 系统选择、WSL2 概念解释以及 Cursor 连接 WSL 开发的完整教程。
<!-- more -->
## 前言
本指南整理自与 Cursor AI 的对话,包含 Windows 系统选择、WSL2 概念解释以及 Cursor 连接 WSL 开发的完整教程。
---
## 一、Windows 10 vs Windows 11 Pro 稳定性对比
### 1.1 结论
**Windows 10 最新版本23H2通常比 Windows 11 更稳定。**
### 1.2 原因分析
| 特性 | Windows 10 | Windows 11 |
|------|------------|------------|
| 成熟度 | 经过多年优化,成熟稳定 | 相对较新,部分功能仍在完善 |
| 兼容性 | 对老旧硬件和软件支持更好 | 要求 TPM 2.0,部分老硬件不兼容 |
| 更新策略 | 主要是维护性更新,变化小 | 持续有新功能更新,变化较多 |
| 驱动支持 | 驱动程序支持更广泛 | 部分老驱动可能不兼容 |
### 1.3 推荐选择
- **专业软件开发/企业环境**:推荐 Windows 10 Pro
- **新硬件/追求新功能**:可以选择 Windows 11 Pro
---
## 二、Java/Go/Vue 开发系统推荐
### 2.1 推荐Windows 11 专业版
对于 Java、Go、Vue 开发,**强烈推荐 Windows 11 专业版**。
### 2.2 优势说明
1. **WSL2 性能优化**
- 启动速度快(几秒 vs 几十秒)
- 资源占用少
- 与 Windows 集成度高
2. **Docker Desktop 支持更好**
- 容器运行更稳定
- 资源管理更高效
3. **Windows Terminal 原生支持**
- 开发体验更流畅
- 多标签页管理方便
### 2.3 各技术栈支持情况
| 技术栈 | Windows 10 | Windows 11 | 说明 |
|--------|------------|------------|------|
| Java | ✅ 良好 | ✅ 良好 | 两者完美支持 |
| Go | ✅ 良好 | ✅ 良好 | 跨平台编译 |
| Vue | ✅ 可用 | ✅ 优秀 | WSL2 下开发体验极佳 |
| Docker | ✅ 可用 | ✅ 优秀 | WSL2 集成更好 |
---
## 三、WSL2 详解
### 3.1 WSL2 是什么
**WSL2 = Windows Subsystem for Linux 2**
即 Windows 上的 Linux 子系统,让 Windows 用户无需安装虚拟机或双系统,直接运行 Linux 环境。
### 3.2 WSL2 vs 虚拟机对比
| 特性 | WSL2 | 虚拟机 |
|------|------|--------|
| 启动速度 | 几秒 | 几十秒 |
| 资源占用 | 少 | 多 |
| 集成度 | 与 Windows 无缝集成 | 独立运行 |
| 性能 | 接近原生 Linux | 有一定损耗 |
### 3.3 WSL2 核心特性
- **独立文件系统**:拥有自己的 Linux 目录结构
- **独立用户系统**:有独立的用户和权限管理
- **独立包管理**:使用 apt、yum 等 Linux 包管理器
- **资源共享**:与 Windows 共享 CPU、内存、网络
### 3.4 文件系统访问
```
Windows 目录 WSL2 访问位置
─────────────────────────────────────
C:\myproject → /mnt/c/myproject
WSL2 目录 Windows 访问位置
─────────────────────────────────────
~/myproject → \\wsl$\Ubuntu\home\user\myproject
```
---
## 四、Cursor 连接 WSL 开发教程
### 4.1 原理说明
Cursor 采用 **Server-Client 架构** 连接 WSL
```
┌─────────────────────────────────────────────────────────┐
│ Windows 端 │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Cursor GUI │◄────►│ WSL 插件 │ │
│ │ (前端界面) │ │ (Server) │ │
│ └─────────────┘ └──────┬──────┘ │
└──────────────────────────────┼───────────────────────────┘
│ SSH/IPC 通信
┌─────────────────────────────────────────────────────────┐
│ WSL 端 │
│ ┌─────────────────────┐ │
│ │ VS Code Server │ │
│ │ (后端服务) │ │
│ └─────────────────────┘ │
│ │ │ │
│ 文件系统 │ │ 终端/调试 │
│ ▼ ▼ │
│ ┌─────────────────────┐ │
│ │ Linux 环境 │ │
│ │ (Java/Node/Go 等) │ │
│ └─────────────────────┘ │
└─────────────────────────────────────────────────────────┘
```
### 4.2 操作步骤
#### 步骤 1安装 WSL 扩展
1. 打开 Cursor
2.`Ctrl + Shift + X` 打开扩展面板
3. 搜索 "WSL"
4. 安装 **"WSL"** 插件Microsoft 官方)
#### 步骤 2进入 WSL 并打开项目
```bash
# 1. 打开 Cursor 终端 (Ctrl + `)
# 2. 进入 WSL 项目目录
cd ~/你的项目路径
# 或访问 Windows 项目
cd /mnt/c/Windows 上的项目路径
# 3. 在 Cursor 中打开
code .
```
#### 步骤 3确认 WSL 模式
连接成功后Cursor 左下角会显示:
- "WSL: Ubuntu" 或你安装的发行版名称
- 终端默认是 Linux bash 环境
- 使用 Linux 版本的开发工具
---
## 五、Cursor SSH 连接远程 Linux 服务器
### 5.1 原理图解
```
Cursor (Windows)
│ Remote - SSH 插件
┌─────────────────┐
│ SSH 连接到服务器 │
│ user@192.168.x │
└────────┬────────┘
┌─────────────────┐
│ 服务器上的 │
│ VS Code Server │
└────────┬────────┘
│ 远程开发
项目目录开发
```
### 5.2 操作步骤
```bash
# 1. 安装 Remote - SSH 插件Ctrl + Shift + X
# 2. SSH 连接服务器
ssh user@192.168.x.x
# 3. 进入项目目录
cd /home/你的项目
# 4. 开发操作
npm install
npm run dev
# 5. 本地访问
# 浏览器打开 http://服务器 IP:3000
```
### 5.3 WSL2 vs SSH 方式对比
| 特性 | WSL2 | SSH 到 Linux 服务器 |
|------|------|---------------------|
| 环境位置 | Windows 内 | 远程服务器 |
| 延迟 | 几乎无 | 有网络延迟 |
| 资源使用 | 本地电脑 | 服务器资源 |
| 便携性 | 随时可用 | 需要网络连接 |
---
## 六、Cursor 系统版与用户版区别
### 6.1 对比表
| 特性 | 系统版 (System) | 用户版 (User) |
|------|-----------------|---------------|
| 作用范围 | 当前操作系统用户 | 所有用户 |
| 安装位置 | `C:\Program Files\Cursor` | `C:\Users\用户名\AppData\Local\Programs\Cursor` |
| 设置同步 | 不随用户登录漫游 | 随用户账户漫游 |
| 管理员权限 | 需要 | 通常不需要 |
| 多用户电脑 | 所有用户共用配置 | 各用户独立配置 |
### 6.2 推荐选择
- **个人电脑**用户版User
- **公司电脑/多用户**系统版System
---
## 七、Cursor 连接 WSL 后的配置位置
### 7.1 配置读取规则
**重要Cursor 连接 WSL 后,所有操作都基于 WSL 的 Linux 系统!**
| 项目 | 读取位置 |
|------|---------|
| 扩展插件 | WSL 里的版本(需重装) |
| Settings | WSL 的 `~/.cursor/` |
| Skills | WSL 里的配置 |
| MCP | WSL 里的配置 |
| 项目代码 | WSL 的文件系统 |
| 运行环境 | WSL 的 Linux 环境 |
### 7.2 注意事项
**Windows 本地的配置不生效:**
- ❌ 扩展不共用(需在 WSL 里重新安装)
- ❌ 快捷键、主题等需重新配置
- ❌ Skills、MCP 配置需要重新设置
**两边配置独立:**
- Windows 的 Cursor 配置 ≠ WSL 里的 Cursor 配置
- 需要维护两套配置
### 7.3 配置同步方案
如果需要同步配置,可以:
1.`.cursor/` 目录链接到共享位置
2. 使用 Cursor 的 Settings Sync 功能
3. 使用版本控制管理配置文件
---
## 八、常见问题 FAQ
### Q1: WSL2 和虚拟机有什么区别?
WSL2 更轻量,启动快、资源占用少,与 Windows 集成度更高。虚拟机是完全独立的系统。
### Q2: Windows 和 WSL 的 Java 环境会冲突吗?
不会。Windows 的 Java 在 `C:\Program Files\Java`WSL 的 Java 在 `/usr/lib/jvm`,两套完全独立。
### Q3: Cursor 连接 WSL 后还能用 Windows 的 MCP 吗?
不能。连接 WSL 后,所有的 MCP、Skills、扩展都读取 WSL 里的配置。
### Q4: 哪种方式更好WSL 还是 SSH
- **本地开发**WSL2
- **远程服务器开发**SSH
### Q5: WSL2 会影响 Windows 性能吗?
WSL2 按需使用内存,不会一直占用,性能接近原生 Linux。
---
## 九、总结
1. **系统选择**Java/Go/Vue 开发推荐 Windows 11 Pro
2. **WSL2 定位**:轻量级 Linux 环境,与 Windows 集成紧密
3. **Cursor 连接**:通过官方 WSL 插件实现远程开发
4. **环境隔离**Windows 和 WSL 的开发和运行环境完全独立
5. **配置管理**:连接 WSL 后需使用 WSL 内的配置和扩展
---
> 最后更新2026 年 2 月

View File

@@ -0,0 +1,233 @@
---
title: 系统崩溃记录
icon: simple-icons:linuxmint
date: 2026-01-30
category:
- Linux
tag:
- Linux Mint
- 系统故障
- XFCE
---
# 系统崩溃记录
记录 Linux Mint XFCE 桌面环境崩溃问题的排查过程和解决方案。
<!-- more -->
## 📅 基本信息
- **时间**: 2026年1月30日
- **系统**: Ubuntu 24.04 (Linux 6.14.0-37-generic)
- **桌面环境**: XFCE
- **问题现象**: XFCE桌面卡死需要重启
## 🔍 问题排查过程
### 1. 系统日志分析
#### 关键错误日志
```
systemd-coredump[1453]: Process 1302 (Xorg) of user 0 dumped core.
```
#### LSDConfig 应用崩溃
- 进程 `LSDConfig` 多次崩溃
- 崩溃原因:尝试连接 DBus 失败
- 相关库:`libControlDevice.so` 蓝牙设备控制
- 错误堆栈显示与蓝牙硬件变体不支持相关
```
Bluetooth: hci0: Unsupported hardware variant (00007902)
```
### 2. GPU 驱动问题
#### AMD GPU 超时警告
```
amdgpu 0000:c4:00.0: [drm] REG_WAIT timeout 1us * 1000 tries - dcn314_dsc_pg_control line:251
amdgpu 0000:c4:00.0: [drm] REG_WAIT timeout 1us * 1000 tries - dcn314_dsc_pg_control line:259
amdgpu 0000:c4:00.0: [drm] REG_WAIT timeout 1us * 1000 tries - dcn314_dsc_pg_control line:267
amdgpu 0000:c4:00.0: [drm] REG_WAIT timeout 1us * 1000 tries - dcn314_dsc_pg_control line:275
```
#### 显卡信息
- 型号AMD Radeon 760M
- 驱动amdgpu 3.61.0
- 显示器:双屏配置
- 主屏SKG 2716 (2560x1440 @ 165Hz)
- 副屏RTK Sculptor (1920x1080 @ 60Hz)
### 3. 系统资源状态
#### 内存使用情况
```
总内存29Gi
已用3.2Gi
可用25Gi
交换15Gi (未使用)
```
- 内存使用正常,无内存压力
- 无 OOM Killer 活动
#### 进程资源占用
```
Xorg 进程8.5% CPU, 212MB 内存
LSDConfig仍在运行但已多次崩溃
```
### 4. 系统启动时间线
- 11:29:43 - 系统启动
- 11:29:46 - Xorg 崩溃并重启
- 11:29:47 - LightDM 显示管理器启动
- 11:30:31 - 用户会话启动
## 🎯 根本原因分析
### 主要原因LSDConfig 应用程序崩溃
**问题详情**
1. LSDConfig 尝试访问蓝牙设备失败
2. DBus 连接问题导致系统调用阻塞
3. 多次崩溃触发 systemd coredump
4. 间接影响 X11 服务器稳定性,导致桌面卡死
**技术分析**
```
堆栈跟踪显示:
g_dbus_connection_send_message_with_reply_sync()
BtStart() - 蓝牙启动失败
libControlDevice.so - 设备控制库错误
```
### 次要原因GPU 驱动超时
- AMD GPU DSC (Display Stream Compression) 电源控制超时
- 虽然不直接导致崩溃,但可能影响渲染性能
## 💡 解决方案
### 立即措施
#### 方案1修复蓝牙问题推荐
```bash
# 更新蓝牙驱动
sudo apt update
sudo apt install --reinstall bluez firmware-amd-graphics
# 重启蓝牙服务
sudo systemctl restart bluetooth
```
#### 方案2临时禁用问题应用
```bash
# 停止 OCular 监控服务
sudo systemctl stop startLSDEfsSvr.service
sudo systemctl disable startLSDEfsSvr.service
# 备份并移除问题应用
sudo mv /usr/local/.OCular/LSDConfig /usr/local/.OCular/LSDConfig.bak
```
#### 方案3完全卸载 OCular 套件
```bash
# 使用官方卸载脚本
sudo /usr/local/.OCular/uninstall.sh
```
### 长期解决方案
1. **联系供应商**
- 向 OCular 软件供应商报告崩溃问题
- 获取针对 AMD GPU 的补丁或更新版本
2. **配置调整**
- 修改 `/etc/.OCular/config.xml`
- 禁用蓝牙设备监控功能
- 减少硬件监控频率
3. **系统优化**
- 定期检查 GPU 驱动更新
- 监控系统日志中的错误信息
## 📊 影响评估
### 禁用 LSDConfig 的影响
**失去的功能**
- ❌ 蓝牙设备自动配置
- ❌ 实时硬件监控
- ❌ 网络访问控制策略
- ❌ 系统性能数据收集
- ❌ 企业级监控报告
**保留的功能**
- ✅ 系统基本功能
- ✅ XFCE 桌面环境
- ✅ 蓝牙手动控制
- ✅ 硬件基础使用
## 🔧 系统配置信息
### 硬件环境
```
CPU: AMD EPYC Embedded 7000 Series (基于虚拟化信息)
GPU: AMD Radeon 760M
内存: 32GB
显示器: 双屏配置
```
### 软件环境
```
操作系统: Ubuntu 24.04
内核版本: 6.14.0-37-generic
X Server: X.Org X Server 1.21.1.11
桌面环境: XFCE
显示管理器: LightDM
```
### 关键进程
```
xfce4-session - XFCE 会话管理
xfwm4 - 窗口管理器
xfce4-panel - 面板
xfce4-terminal - 终端
LSDConfig - OCular 设备配置管理器 (问题源头)
```
## 📝 后续建议
1. **监控日志**
```bash
# 持续监控 Xorg 日志
tail -f /var/log/Xorg.0.log
# 监控系统日志
journalctl -f
```
2. **定期检查**
- 每周检查系统错误日志
- 监控 GPU 温度和性能
- 关注 OCular 服务状态
3. **备份配置**
- 定期备份 `/etc/.OCular/` 配置
- 保存重要的 XFCE 配置文件
4. **预防措施**
- 避免同时运行大量图形密集应用
- 定期更新系统驱动
- 保持足够的系统资源
## 📞 技术支持
如果问题持续,请联系:
- **系统管理员**:检查企业监控策略
- **硬件供应商**:确认 GPU 驱动兼容性
- **OCular 软件供应商**:报告崩溃问题并获取支持
---
**文档创建时间**: 2026-01-30 11:40
**排查工具**: journalctl, dmesg, Xorg 日志, 进程监控
**记录状态**: 已完成初步分析和解决方案制定

64
src/work/log/2026-01.md Normal file
View File

@@ -0,0 +1,64 @@
---
icon: mdi:note-text
date: 2026-01-01
category:
- 日志
tag:
- 个人日志
title: 202601日志
---
202601日志
<!-- more -->
# 2026年1月工作日志
## 第一周1月1日-1月7日
## 第二周1月8日-1月14日
## 第三周1月15日-1月21日
## 第四周1月22日-1月28日
### PRS7050场站系统
#### 上周工作总结1月19日-1月25日
##### 一、主要工作内容
1. **流水线与依赖注入修复**
- 修复设备点流水线中的依赖注入问题 (#249843)
- 优化导入更新流程不再处理syscode (#249841)
- 修复空指针异常问题,过滤空名称条目 (#249830)
2. **监控与平台集成**
- 实现遥控配置获取功能,结合平台接口 (#249811)
- 修复控制服务pom.xml依赖异常问题
3. **数据库兼容性优化**
- 解决瀚高数据库更新后顺序改变的问题 (#249802)
- 修复mysqli函数last_insert_id在瀚高数据库中的报错问题 (#249793)
- 优化MyBatis映射文件中的SQL语句 (#249795)
- 处理动态SQL包含问号的问题 (#249794)
4. **项目配置与依赖管理**
- 调整模块顺序并更新模块名称优化sunri-mybatisplus-starter (#249797)
- 同步2024多个版本更新 (#249764, #249763, #249795, #249794, #249793)
- 修复依赖异常 (#249754)
- 移除单体项目 (#249752)
5. **协议与配置优化**
- 默认取二次设备协议 (#249756)
- 清理私有仓库配置 (删除10.1.105.49:8081) (#249751, #249748)
##### 二、本周工作重点
- 完成了多项数据库兼容性优化,提升了系统在瀚高数据库环境下的稳定性
- 修复了关键的依赖注入问题,保障了设备点流水线功能的正常运行
- 优化了项目配置结构,清理了不必要的仓库配置
##### 三、下周计划
- 继续跟进数据库兼容性问题
- 优化系统性能和稳定性
## 第五周1月29日-1月31日