Nutch 1.14在RHEL6环境下Maven编译失败求助
从你的报错信息来看,核心问题是Slf4j日志API的方法重载调用不匹配——代码里调用LOG.debug()时传入的参数符合低版本Slf4j的签名,但Maven拉取的依赖却是更高版本的Slf4j,导致JVM试图把String转换成org.slf4j.Marker类型(高版本Slf4j的debug重载会优先匹配带Marker的方法)。下面是具体的解决思路:
1. 锁定Slf4j依赖版本
Nutch 1.14官方默认依赖的是Slf4j 1.7.x系列,如果你本地Maven仓库里混入了更高版本的Slf4j(比如1.8+),就会出现这种类型不兼容问题。你需要在Nutch项目的根pom.xml里添加dependencyManagement节点,强制指定Slf4j的版本:
<dependencyManagement> <dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency> </dependencies> </dependencyManagement>
2. 彻底清理并重新构建
仅仅删除.m2/repository可能不够,建议执行以下命令强制清理并更新依赖:
mvn clean install -U -X
-clean:清除之前的编译产物-U:强制Maven更新快照和依赖版本-X:保留调试日志,方便后续排查
3. 检查代码是否被误修改
你提供的代码片段里的LOG.debug()调用是正常的,但请确认FetcherThread.java的511、522行的完整代码:
if (origHost.equals(newHost)) {
LOG.debug( " - ignoring redirect {} from {} to {} because internal links are ignored", redirType, urlString, newUrl);
return null;
}
确保这些行里的LOG.debug()第一个参数是字符串字面量,没有被误写成Marker类型的变量,也没有参数顺序颠倒的情况(比如把Marker参数放在了第一个位置)。
4. 检查Java环境兼容性
虽然你用的是Java 1.8(Nutch 1.14支持Java 7+),但RHEL6自带的OpenJDK可能存在一些兼容性问题,建议切换到Oracle JDK 1.8再尝试构建,避免环境层面的隐性问题。
内容的提问来源于stack exchange,提问作者Quent

