当用户提出以下任意意图时,加载并执行本 Skill:
输出到独立目录,而非原地修改原 Gradle 项目。
目录命名约定:${原项目名}_mvn 或用户指定名称。\
示例:atlasdb_pltr_official → atlasdb_pltr_official_mvn
这样做的好处:
build.gradle、settings.gradle、gradlew 等 Gradle 文件完全保留,用户可随时回滚target/ 目录)不会污染原始源码操作方式:将整个项目目录复制一份到新目录,在副本中生成 pom.xml。
你是 Gradle → Maven 迁移专家。目标是:在独立目录中生成 pom.xml 文件(根模块 + 所有子模块),让项目可以直接用 mvn compile / mvn package 编译。
流程:
${原项目名}_mvn 独立目录mvn validate 验证通过后,清理副本中的所有 Gradle 文件build.gradle / settings.gradle / gradlew 等完全保留,用户可随时回滚在动手前,完整理解项目结构:
# 1. 列出根目录
ls <project_root>/
# 2. 找到所有 build.gradle / build.gradle.kts / settings.gradle
find <project_root> -maxdepth 3 \
\( -name "build.gradle" -o -name "build.gradle.kts" \
-o -name "settings.gradle" -o -name "settings.gradle.kts" \
-o -name "gradle.properties" -o -name "versions.props" \
-o -name "versions.lock" \) | sort
# 3. 读取关键文件
# - settings.gradle / settings.gradle.kts → 子模块列表
# - 根 build.gradle → group/version/全局依赖/插件
# - versions.props / gradle.properties → 依赖版本
# - 1~3 个典型子模块的 build.gradle → 依赖声明模式
# 4. 复制项目到独立 Maven 目录
# 生成目录名为 ${原项目名}_mvn,或用户指定
mvn_dir="${project_root}_mvn"
cp -r <project_root> <mvn_dir>
# 确认复制成功
find <mvn_dir> -name "pom.xml" | wc -l # 应为 0(还没有 pom.xml)
需要搞清楚:
sourceCompatibility / javaVersions { libraryTarget })dependencies {} 内容versions.props、ext.versions、硬编码)注意:所有后续操作(生成 pom.xml、验证)都在 副本目录中进行,原 保持不变。
读取每个 build.gradle 并提取:
| Gradle 配置 | Maven 映射 |
|---|---|
| -------------------------- | ------------------------------------- |
api 'group:artifact' | |
implementation '...' | |
compileOnly '...' | |
runtimeOnly '...' | |
testImplementation '...' | |
testCompileOnly '...' | + |
testRuntimeOnly '...' | |
annotationProcessor '...' | 或配置 maven-compiler-plugin 的 annotationProcessorPaths |
project(':sub-module') | 本地模块坐标 |
exclude (group: 'g', module: 'm') | |
版本号从 versions.props / ext.versions 中查找;找不到的保留占位符 。
根 pom.xml 必须包含:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>${group}</groupId>
<artifactId>${rootProjectName}</artifactId>
<version>${version}</version>
<packaging>pom</packaging>
<!-- 子模块列表 -->
<modules>
<module>sub-module-dir</module>
...
</modules>
<!-- 全局属性:Java 版本、编码 -->
<properties>
<java.version>17</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 各依赖版本变量 -->
</properties>
<!-- dependencyManagement:来自 versions.props 的统一版本 -->
<dependencyManagement>
<dependencies>
...
</dependencies>
</dependencyManagement>
<!-- 全局 build 配置 -->
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<release>${java.version}</release>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.5.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
每个子模块的 pom.xml:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>${group}</groupId>
<artifactId>${rootProjectName}</artifactId>
<version>${version}</version>
<relativePath>../pom.xml</relativePath> <!-- 嵌套子模块用 ../../pom.xml -->
</parent>
<artifactId>${submodule-name}</artifactId>
<packaging>jar</packaging>
<dependencies>
<!-- 按 scope 分组:compile → provided → runtime → test -->
</dependencies>
</project>
注意:
project(':xxx') 依赖,转换为同一 groupId + 对应 artifactId 的 ,不写 (由 parent 的 dependencyManagement 管理)annotationProcessor 依赖放入 maven-compiler-plugin 的 中settings.gradle 中形如 :parent:child 的路径,对应目录 parent/child/:
parent/pom.xml 的 pom , 包含 childchild/pom.xml 的 relativePath 为 ../pom.xmlpom.xml 的 包含 parent(不直接包含 child)<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.immutables</groupId>
<artifactId>value</artifactId>
<version>${immutables.version}</version>
</path>
<!-- 其他 processor -->
</annotationProcessorPaths>
</configuration>
</plugin>
compileOnly 'org.immutables:value::annotations' 对应的 classifier 依赖:
<dependency>
<groupId>org.immutables</groupId>
<artifactId>value</artifactId>
<classifier>annotations</classifier>
<scope>provided</scope>
</dependency>
生成完成后运行:
# 验证 pom.xml 格式正确
mvn -f <mvn_dir>/pom.xml validate -q 2>&1 | head -40
# 尝试解析依赖(不下载)
mvn -f <mvn_dir>/pom.xml dependency:resolve -o -q 2>&1 | head -60
如有错误,修复后再次验证。只有当 mvn validate 零错误通过时,才继续执行 Step 7。
前提:mvn validate 必须零错误通过。
验证通过后,在 副本目录中删除所有 Gradle 相关文件,保持 Maven 工程目录整洁:
# 删除 Gradle 构建脚本
find <mvn_dir> -maxdepth 4 \( \
-name "build.gradle" -o -name "build.gradle.kts" \
-o -name "settings.gradle" -o -name "settings.gradle.kts" \
-o -name "gradle.properties" \
-o -name "versions.props" -o -name "versions.lock" \
\) -delete
# 删除 Gradle Wrapper
rm -f <mvn_dir>/gradlew <mvn_dir>/gradlew.bat
rm -rf <mvn_dir>/gradle/
# 删除 Gradle 缓存目录
rm -rf <mvn_dir>/.gradle/
# 删除各模块下的 Gradle 构建产物(build/ 目录)
find <mvn_dir> -maxdepth 4 -type d -name "build" -exec rm -rf {} + 2>/dev/null
# 确认清理结果
echo "=== 剩余 Gradle 文件 ===" && find <mvn_dir> -name "*.gradle*" 2>/dev/null || echo "(无)"
echo "=== pom.xml 数量 ===" && find <mvn_dir> -name "pom.xml" | wc -l
注意:
副本中执行,原 Gradle 项目完全不受影响mvn validate 未通过,不要执行清理,等修复后再说生成一份 MAVEN_MIGRATION_REPORT.md,包含:
mvn validate 通过 → 删除新目录中所有 Gradle 文件,原 Gradle 项目目录完全不受影响pom.xml 的 中,子模块不写版本号 用 ${project.version} 或直接省略(parent 管理)baseline、conjure、consistent-versions 等):这些是 Gradle 专属工具,Maven 没有等价物,直接跳过,在报告中注明mvn validate 未通过时,不要执行清理步| Gradle | Maven scope | 说明 |
|---|---|---|
| ------------------- | -------------- | ----------------------------- |
api | compile | 传递性依赖 |
implementation | compile | 不传递 |
compileOnly | provided | 编译期,运行时不需要 |
runtimeOnly | runtime | |
testImplementation | test | |
testCompileOnly | test | |
testRuntimeOnly | test | |
annotationProcessor | 见 Step 5 | 放入 compiler plugin |
共 1 个版本