Apache Ranger 2.6 Maven构建Enunciate编译错误解决问询
解决Apache Ranger 2.6构建Enunciate编译失败问题
一、具体修复方案
1. 处理org.apache.ranger.credentialapi.CredentialReader类重复问题
- 执行
mvn dependency:tree查看依赖树,定位重复引入该类的依赖包,在对应模块的pom.xml中用<exclusions>标签排除重复依赖。 - 如果是Enunciate代码生成插件重复生成该类,调整
enunciate.xml或pom中的Enunciate插件配置,将该类从生成逻辑中排除。
2. 解决com.google.common.annotations.VisibleForTesting找不到的问题
- 确认guava版本:该注解在guava兼容Java8的稳定版本(如28.2-jre)中仍保留在
com.google.common.annotations包,部分新版本存在包路径迁移情况。 - 显式锁定guava版本:在父pom或当前模块pom中添加依赖,强制使用兼容版本:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>28.2-jre</version> <scope>compile</scope> </dependency> - 给Enunciate插件添加guava依赖:若插件类加载器无法识别项目依赖的guava,在插件配置中显式引入:
<plugin> <groupId>org.codehaus.enunciate</groupId> <artifactId>maven-enunciate-plugin</artifactId> <version>你当前使用的Enunciate版本</version> <dependencies> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>28.2-jre</version> </dependency> </dependencies> <!-- 其他原有配置 --> </plugin> - 排查依赖冲突:用
mvn dependency:tree找出引入低版本guava的依赖,通过<exclusions>排除,避免maven自动选择无注解的低版本。
3. 分步构建定位问题
拆分构建命令,先执行mvn clean compile确认基础编译正常,再执行mvn package install,便于快速定位问题环节。若临时需要跳过Enunciate检查,可添加参数-Dmaven.enunciate.skip=true,但此为权宜之计,建议优先修复根源问题。
二、问题原因解析
- 依赖版本冲突:项目中同时引入多个版本guava时,maven依赖调解机制可能选择不包含目标注解的低版本,导致编译时找不到符号。
- Enunciate类加载隔离:Enunciate插件运行时使用独立类加载器,未正确加载项目依赖的guava包,无法识别注解类。
- 注解包路径迁移:guava不同版本对
VisibleForTesting的包路径做过调整,若项目代码引用旧路径但依赖新版本guava,会出现找不到符号的情况。
内容的提问来源于stack exchange,提问作者MarcT
相关产品推荐
相关产品推荐

