【问题标题】:java maven - override version of another dependencyjava maven - 覆盖另一个依赖项的版本
【发布时间】:2013-06-20 21:41:36
【问题描述】:

由于要求,我有两个无法更改的依赖项。两者都在 maven 中使用 scala 依赖。

  <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-library</artifactId>
        <version>2.8.2</version>
  </dependency>

一个依赖是添加到项目中的 jar 文件库,而另一个依赖是 maven 依赖。

问题在于两者都需要 scala 依赖项,一个使用 2.8.2 版本,一个使用 2.10.2 版本。两者都不能与另一个版本号一起使用。

底线是:如何将 maven 依赖项设置为使用 2.10.2 而 jar 文件为 2.8.2?

【问题讨论】:

  • 您是否正在尝试使用 maven 构建 play 2 框架 webapps?
  • 不,我不想达到这个目的。我需要的两个依赖项都只是一些基本库,但我需要它们并且我无法更改它们的代码。它们都需要 scala-library,但使用不同的版本号。问题是我该怎么做。
  • 如果两个库都是编译依赖项,而不将旧版本从 scala 2.8 移植到 scala 2.10,我认为这是不可能的;那是因为 scala 不是二进制兼容的。我不是 scala 专家强硬,希望你能找到更好的答案,同时你得到我的 +1

标签: java scala maven intellij-idea dependencies


【解决方案1】:

解决此问题的一种疯狂方法是创建两个单独的 maven 工件,其中一个引用另一个:

Scala version 1        Scala Version 2
      |                    |
     \ /                  \ /
  Art1fact 1 --------> Artifact 2

现在,在 Artifact 1 中,使用 Maven Shade Plugin 创建一个带有依赖项的 jar(有关详细信息,请参阅 Maven-Assembly-Pluginusing class relocation(例如,将所有类从 scala.* 映射到 old.scala.*)。重要的部分是 Artifact 2 只会引用 Artifact 1 的阴影版本,因此省略了 Scala 依赖项。

ProGuard会让你达到类似的结果)

【讨论】:

  • 这听起来像是一大堆工作,需要我不断地修改罐子,对吧?由于图书馆不时发生变化,这似乎需要很多工作?
  • “这听起来像是一大堆工作”是真的,但如果不是这样,您将找不到解决方案。但我不明白随着时间的推移,这将如何导致您进行额外的工作。当一个库发生变化时,你将不得不改变你的代码,不管有没有这个解决方案。
  • 只是不要使用普通的旧罐子。使用 Maven 或不使用 Maven,混合使用这两种方法总是会给你带来配置地狱
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
相关资源
最近更新 更多