Maven POM 查询模式
<when_to_use>
在查询任何 pom.xml 文件时加载此技能 —— 提取依赖版本、按 groupId 或 scope 过滤、从父 POM 映射模块层次结构,或在多模块 Java 项目中检测版本冲突。
</when_to_use>
使用 dasel v3 查询 Maven POM XML 文件的领域技能。始终显式传递 -i xml 参数。子元素文本内容(groupId、artifactId、version、scope)直接通过元素名称访问 —— 无需 #text。将中间批量结果写入 /tmp/,切勿写入源代码树。
依赖提取
# 单个 POM 中的所有依赖 groupId
cat pom.xml | dasel -i xml 'project.dependencies.dependency.map(groupId)'
框架版本过滤
按 groupId 过滤依赖以隔离特定框架的版本。
# Spring 依赖版本
cat pom.xml | dasel -i xml 'project.dependencies.dependency.filter(groupId == "org.springframework").map(version)'
# Hibernate 依赖版本
cat pom.xml | dasel -i xml 'project.dependencies.dependency.filter(groupId == "org.hibernate").map(version)'
范围过滤
# 测试范围依赖的 artifactId
cat pom.xml | dasel -i xml 'project.dependencies.dependency.filter(scope == "test").map(artifactId)'
# 编译范围依赖(无 scope 元素默认为 compile)
cat pom.xml | dasel -i xml 'project.dependencies.dependency.filter(scope == "compile").map(artifactId)'
模块层次结构
从父 POM 提取模块路径以映射项目结构。
# 父 POM 中的模块列表
cat pom.xml | dasel -i xml 'project.modules.module'
跨 POM 版本冲突检测
批量模式 —— 遍历所有 POM,逐个提取依赖并进行比较。将结果写入 /tmp/。
# 收集层次结构中所有 POM 的依赖 groupId
for pom in $(fdfind -e xml -n pom.xml .); do
echo "=== $pom ===" >> /tmp/all_deps.txt
cat "$pom" | dasel -i xml 'project.dependencies.dependency.map(groupId)' >> /tmp/all_deps.txt 2>/dev/null
done
检查 /tmp/all_deps.txt 查找同一 groupId 在不同模块中出现不同版本的情况。
多字段提取
同时提取 groupId 和 artifactId 以构建依赖清单。
# 依赖坐标(groupId + artifactId)—— 分两次运行
cat pom.xml | dasel -i xml 'project.dependencies.dependency.map(groupId)'
cat pom.xml | dasel -i xml 'project.dependencies.dependency.map(artifactId)'
DependencyManagement vs 依赖
企业 POM 使用 dependencyManagement 声明由 BOM 控制的版本,与活动的 dependencies 分开管理。
# 管理的依赖版本(BOM 部分)
cat pom.xml | dasel -i xml 'project.dependencyManagement.dependencies.dependency.map(version)'
# 活动依赖版本(如果版本来自 BOM 可能为空)
cat pom.xml | dasel -i xml 'project.dependencies.dependency.map(version)'