命令行编译apollo-client-maven-plugin生成的Kotlin代码失败求助
排查方向建议
1. 确认apollo插件的执行阶段与代码生成时机
- 检查
apollo-client-maven-plugin的<phase>配置,确保它在测试编译前执行(比如绑定到generate-test-sources阶段)。如果插件在test-compile之后才生成Kotlin代码,maven测试编译时会找不到刚生成的类,就会报Unresolved reference: graphql。 - 对比
targetLanguage=JAVA时的插件执行阶段配置,确认Kotlin模式下没有差异。 - 可以通过
mvn clean verify -X(debug模式)查看插件执行的时间点,确认是否早于test-compile阶段。
2. 让kotlin-maven-plugin识别生成的Kotlin代码目录
IDEA会自动扫描生成代码目录,但maven命令行不会。需要在kotlin-maven-plugin的配置中手动添加apollo生成代码的路径:
<plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <configuration> <!-- 主代码生成目录 --> <sourceDirs> <sourceDir>${project.basedir}/src/main/kotlin</sourceDir> <sourceDir>${project.build.directory}/generated-sources/apollo</sourceDir> </sourceDirs> <!-- 测试代码生成目录 --> <testSourceDirs> <testSourceDir>${project.basedir}/src/test/kotlin</testSourceDir> <testSourceDir>${project.build.directory}/generated-test-sources/apollo</testSourceDir> </testSourceDirs> </configuration> </plugin>
3. 检查apollo依赖的作用域与版本兼容性
- 确保
apollo-runtime-kotlin等依赖的作用域正确:如果是测试代码使用,设为<scope>test</scope>;主代码使用则设为<scope>compile</scope>,避免测试编译阶段依赖缺失。 - 确认apollo插件版本与runtime版本完全一致,且支持Kotlin 1.5。比如部分apollo3版本最低要求Kotlin 1.6,若你的项目用1.5,需降级到兼容的apollo版本。
- 多模块项目中,检查父pom的
dependencyManagement是否正确声明了apollo依赖版本,子模块是否正确引入依赖。
4. 解决泛型类型推断问题
Not enough information to infer type variable D错误可能是maven的Kotlin编译器比IDEA更严格导致的:
- 找到测试代码中调用生成的GraphQL代码的地方,显式指定泛型类型,比如将
apolloClient.query(MyQuery())改为apolloClient.query<MyQuery.Data, MyQuery.Variables>(MyQuery())。 - 检查生成的Kotlin代码是否存在泛型定义不明确的情况,可对比JAVA模式下生成的代码结构,看Kotlin版本的生成逻辑是否有差异。
5. 验证maven构建的依赖传递与缓存
- 执行
mvn clean dependency:tree,查看测试阶段的依赖树,确认apollo-runtime-kotlin及其依赖(如graphql-java)是否被正确引入到测试类路径中。 - 排除maven缓存问题,执行
mvn clean verify -U -Dmaven.repo.local=/tmp/new-repo,用全新的本地仓库构建,看是否仍报错。
内容的提问来源于stack exchange,提问作者Chris S
相关产品推荐
相关产品推荐

