一、問題背景
代碼已經提交到github,完整代碼請參考:Ttbigdata
在 Bigtop 編譯 Apache Knox 2.1.0 的過程中,構建流程推進到測試相關模塊:
gateway-test-release / webhdfs-test
前置模塊(webhdfs-kerb-test)已經成功,但在 webhdfs-test 階段,Maven 構建被 enforcer 插件強制中斷,後續所有 Knox 模塊全部 SKIPPED。
這類問題在 Knox + Hadoop 混合依賴 的場景中並不少見,通常不是代碼錯誤,而是 歷史依賴版本疊加後的收斂問題。
二、報錯信息與關鍵日誌
失敗發生在 maven-enforcer-plugin:enforce-dependencies 階段,核心日誌如下:
Dependency convergence error for com.sun.jersey:jersey-core:1.19.4 paths to dependency are:
+- org.apache.knox:webhdfs-test:2.1.0
+- com.sun.jersey:jersey-server:1.19.4
+- com.sun.jersey:jersey-core:1.19.4
and
+- org.apache.knox:webhdfs-test:2.1.0
+- org.apache.hadoop:hadoop-common:3.3.4
+- com.sun.jersey:jersey-core:1.19
類似的衝突還出現在:
jersey-servletjersey-serverjersey-json
最終 Maven 給出的結論是:
Rule 0: org.apache.maven.plugins.enforcer.DependencyConvergence failed
構建結果:
[INFO] --------------------< org.apache.knox:webhdfs-test >--------------------
[INFO] Building webhdfs-test 2.1.0 [2/5]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- buildnumber-maven-plugin:1.4:create (default) @ webhdfs-test ---
[INFO] Executing: /bin/sh -c cd '/opt/modules/bigtop/dl/knox-2.1.0-RC2/gateway-test-release/webhdfs-test' && 'git' 'rev-parse' '--verify' 'HEAD'
[INFO] Working directory: /opt/modules/bigtop/dl/knox-2.1.0-RC2/gateway-test-release/webhdfs-test
[INFO] Storing buildNumber: 13021fcabafff320dfed6d0b8abed3ca630432b7 at timestamp: 1765449153438
[WARNING] Cannot get the branch information from the git repository:
Detecting the current branch failed: fatal: ref HEAD is not a symbolic ref
[INFO] Executing: /bin/sh -c cd '/opt/modules/bigtop/dl/knox-2.1.0-RC2/gateway-test-release/webhdfs-test' && 'git' 'rev-parse' '--verify' 'HEAD'
[INFO] Working directory: /opt/modules/bigtop/dl/knox-2.1.0-RC2/gateway-test-release/webhdfs-test
[INFO] Storing buildScmBranch: UNKNOWN
[INFO]
[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (enforce-maven-version) @ webhdfs-test ---
[INFO]
[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (enforce-maven) @ webhdfs-test ---
[INFO]
[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (enforce-dependencies) @ webhdfs-test ---
[WARNING]
Dependency convergence error for com.sun.jersey:jersey-core:1.19.4 paths to dependency are:
+-org.apache.knox:webhdfs-test:2.1.0
+-com.sun.jersey:jersey-server:1.19.4
+-com.sun.jersey:jersey-core:1.19.4
and
+-org.apache.knox:webhdfs-test:2.1.0
+-org.apache.hadoop:hadoop-common:3.3.4
+-com.sun.jersey:jersey-core:1.19
and
+-org.apache.knox:webhdfs-test:2.1.0
+-org.apache.hadoop:hadoop-common:3.3.4
+-com.sun.jersey:jersey-json:1.19
+-com.sun.jersey:jersey-core:1.19
and
+-org.apache.knox:webhdfs-test:2.1.0
+-org.apache.hadoop:hadoop-hdfs:3.3.4
+-com.sun.jersey:jersey-core:1.19
and
+-org.apache.knox:webhdfs-test:2.1.0
+-org.apache.hadoop:hadoop-hdfs:3.3.4
+-com.sun.jersey:jersey-core:1.19
[WARNING]
Dependency convergence error for com.sun.jersey:jersey-servlet:1.19.4 paths to dependency are:
+-org.apache.knox:webhdfs-test:2.1.0
+-com.sun.jersey:jersey-servlet:1.19.4
and
+-org.apache.knox:webhdfs-test:2.1.0
+-org.apache.hadoop:hadoop-common:3.3.4
+-com.sun.jersey:jersey-servlet:1.19
[WARNING]
Dependency convergence error for com.sun.jersey:jersey-server:1.19.4 paths to dependency are:
+-org.apache.knox:webhdfs-test:2.1.0
+-com.sun.jersey:jersey-server:1.19.4
and
+-org.apache.knox:webhdfs-test:2.1.0
+-com.sun.jersey:jersey-servlet:1.19.4
+-com.sun.jersey:jersey-server:1.19.4
and
+-org.apache.knox:webhdfs-test:2.1.0
+-org.apache.hadoop:hadoop-common:3.3.4
+-com.sun.jersey:jersey-server:1.19
and
+-org.apache.knox:webhdfs-test:2.1.0
+-org.apache.hadoop:hadoop-hdfs:3.3.4
+-com.sun.jersey:jersey-server:1.19
and
+-org.apache.knox:webhdfs-test:2.1.0
+-org.apache.hadoop:hadoop-hdfs:3.3.4
+-com.sun.jersey:jersey-server:1.19
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.DependencyConvergence failed with message:
Failed while enforcing releasability. See above detailed error message.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for webhdfs-kerb-test 2.1.0:
[INFO]
[INFO] webhdfs-kerb-test .................................. SUCCESS [01:33 min]
[INFO] webhdfs-test ....................................... FAILURE [ 19.826 s]
[INFO] gateway-shell-release .............................. SKIPPED
[INFO] gateway-docker ..................................... SKIPPED
[INFO] gateway-release-common ............................. SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:57 min
[INFO] Finished at: 2025-12-11T10:32:52Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M3:enforce (enforce-dependencies) on project webhdfs-test: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed. -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn <args> -rf :webhdfs-test
三、問題根因分析
1. Knox 自身依賴 Jersey 1.19.4
Knox 2.1.0 的部分測試模塊,顯式或間接依賴:
com.sun.jersey:*:1.19.4
這屬於 Knox 側主動升級的 Jersey 版本。
2. Hadoop 3.3.4 仍停留在 Jersey 1.19
而 Bigtop 中引入的 Hadoop 版本為:
org.apache.hadoop:hadoop-common:3.3.4
其依賴鏈中仍然使用:
com.sun.jersey:*:1.19
3. Enforcer 不允許「同 GAV 多版本並存」
maven-enforcer-plugin 的 DependencyConvergence 規則非常嚴格:
同一個 artifactId,在依賴樹中只能存在一個版本
因此當 1.19 與 1.19.4 同時出現時,即使功能兼容,也會直接 fail。
這是一個構建策略問題,不是運行期問題。 如果關閉 enforcer,構建是可以繼續的,但並不推薦。
四、解決方案
思路説明
目標不是“消滅某條依賴路徑”,而是:
讓 Knox 與 Hadoop 在 Jersey 版本上達成一致
在當前 Knox + Hadoop 組合下,回退到 Hadoop 使用的 1.19 版本是風險最低、改動最小的方案。
方案:統一 Jersey 版本(推薦)
1. 修改 pom.xml
編輯文件:
gateway-test-release/webhdfs-test/pom.xml
在 <properties> 節點中加入:
<properties>
<hadoop-jersey.version>1.19</hadoop-jersey.version>
</properties>
該 property 會被 Knox 構建體系中的依賴管理引用,從而統一 Jersey 版本。
這種方式 不需要 exclude, 也不會影響 Hadoop 依賴路徑, 屬於「向下對齊」的穩妥修復。
2. 恢復構建
mvn compile -rf :webhdfs-test
正常情況下,webhdfs-test 將順利通過,後續模塊繼續執行。