一、問題背景

代碼已經提交到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-servlet
  • jersey-server
  • jersey-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-pluginDependencyConvergence 規則非常嚴格:

同一個 artifactId,在依賴樹中只能存在一個版本

因此當 1.191.19.4 同時出現時,即使功能兼容,也會直接 fail。

這是一個構建策略問題,不是運行期問題。 如果關閉 enforcer,構建是可以繼續的,但並不推薦。

四、解決方案

思路説明

目標不是“消滅某條依賴路徑”,而是:

讓 Knox 與 Hadoop 在 Jersey 版本上達成一致

在當前 Knox + Hadoop 組合下,回退到 Hadoop 使用的 1.19 版本是風險最低、改動最小的方案。

方案:統一 Jersey 版本(推薦)

1. 修改 pom.xml

編輯文件:

gateway-test-release/webhdfs-test/pom.xml

【Knox編譯】webhdfs-test 依賴收斂衝突問題處理_knox

<properties> 節點中加入:

<properties>
    <hadoop-jersey.version>1.19</hadoop-jersey.version>
</properties>

該 property 會被 Knox 構建體系中的依賴管理引用,從而統一 Jersey 版本。

這種方式 不需要 exclude, 也不會影響 Hadoop 依賴路徑, 屬於「向下對齊」的穩妥修復。

2. 恢復構建
mvn compile -rf :webhdfs-test

正常情況下,webhdfs-test 將順利通過,後續模塊繼續執行。