【问题标题】:Maven different package name in newer dependency新依赖项中的 Maven 不同的包名称
【发布时间】:2021-09-26 02:14:33
【问题描述】:

我正在处理的项目会生成一个我在 azure 上部署的 jar,以便 Spark 运行该作业。 它使用的是内部依赖项 A,它使用依赖项 org.apache.commons:commons-configuration:1.10 但是当我在 azure 上部署时,它默认使用 2.1.1 版本。

在 azure 上,我们有 2.1.1 版本,其中包名称 (org.apache.commons.configuration2) 与 1.10 版本 (org.apache.commons.configuration) 不同。

所以在依赖A中有这一行在使用2.1.1版本时会报错:

Import org.apache.commons.configuration

它需要在末尾有“2”,我不能添加为 A 的东西是一个依赖项。

我尝试从 A 中排除 org.apache.commons:commons-configuration,然后使用 maven shade 插件重命名包,但 jar 文件变为实际大小的两倍,除了单独生成的阴影 jar,而不是在工作流的 zip 中,并且sh 文件,我的团队可能不喜欢的东西。

【问题讨论】:

  • 您是否尝试过使用 shade 插件来重新定位您的代码所依赖的版本。
  • 是的,但是罐子变大了一倍

标签: java maven apache-spark hadoop


【解决方案1】:

从 commons-configuration 1 更新到 2 是一个重大变化,新版本不是直接替代品。正如您已经指出的顶级包更改,这很可能会阻止库 A。正确的解决方案可能是更新库 A 以使用 commons-configuration 2。

您仍然可以尝试破解 Maven 项目设置以查看它是否有效:

  1. 使用 <exclude> 标记从库 A 依赖项中排除 commons-configuration 1。
  2. 在模块 B 中添加 commons-configuration 2 作为直接项目依赖项,provided 范围。The provided scope is needed to avoid packaging the dependency.

【讨论】:

  • 由于库 A 依赖于 commons-configuration 1,排除它只会导致 ClassNotFoundException。
【解决方案2】:

如果您想避免使用 maven-shade 插件,那么替代解决方案可能是:

  1. 在库A依赖声明中排除commons-configuration 1;

  2. 找出库 A 使用 commons-configuration 1 中的哪些类和方法(如果你有源代码就很容易了,否则现代 IDE 会为你反汇编它);

  3. 在您的应用程序中编写您自己的这些类和方法的版本,以委托给 commons-configuration2 实现。

请注意,commons-configuration2 是 Apache Spark 发行版的一部分,不能忽略。需要使用 <scope>provided</scope> 将其添加到您的项目中。

如果这太难了,那么 maven-shade-plugin 是您唯一可行的解​​决方案。

【讨论】:

    猜你喜欢
    • 2014-11-10
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2013-11-17
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    相关资源
    最近更新 更多