【问题标题】:sbt Managed dependency retrieving wrong versionsbt 托管依赖检索错误版本
【发布时间】:2013-12-18 22:34:43
【问题描述】:

我正在通过 Play 框架使用 SBT,但我在 build.sbt 文件中遇到了管理依赖项的问题。

我的 build.sbt 文件:

name := "name"

version := "1.0-SNAPSHOT"

libraryDependencies ++= Seq(
javaJdbc,
javaEbean,
cache,
"de.undercouch" % "bson4jackson" % "2.1.0" force(),
"com.fasterxml.jackson.core" % "jackson-databind" % "2.1.0" force(),
"com.fasterxml.jackson.core" % "jackson-annotations" % "2.1.0" force(),
"com.fasterxml.jackson.core" % "jackson-core" % "2.1.0" force(),
"org.mongodb" % "mongo-java-driver" % "2.11.3",
"org.jongo" % "jongo" % "0.4",
"uk.co.panaxiom" %% "play-jongo" % "0.6.0-jongo0.4",
"org.glassfish.jersey.core" % "jersey-client" % "2.4",
"org.glassfish.jersey.core" % "jersey-common" % "2.4",
"org.glassfish.jersey.core" % "jersey-server" % "2.4",
"org.glassfish.jersey.containers" % "jersey-container-jdk-http" % "2.4"
)     

play.Project.playJavaSettings

当我尝试在我的生产环境 (Ubuntu) 上构建时,我收到以下错误: M[2K[0m[[0minfo[0m] [0mResolving org.glassfish.jersey.core#jersey-client;2.4 ...[0m

M[2K[0m[[0minfo[0m] [0mResolving org.glassfish.jersey.core#jersey-common;2.4 ...[0m

M[2K[0m[[0minfo[0m] [0mResolving javax.ws.rs#javax.ws.rs-api;2.0 ...[0m

M[2K[0m[[0minfo[0m] [0mResolving javax.annotation#javax.annotation-api;1.2 ...[0m

M[2K[0m[[0minfo[0m] [0mResolving org.glassfish.hk2#hk2-api;2.2.0-b21 ...[0m
M[2K[0m[[0minfo[0m] [0mResolving org.glassfish.hk2#hk2-utils;2.4 ...[0m
[0m[[33mwarn[0m] [0m    module not found: org.glassfish.hk2#hk2-utils;2.4[0m
[0m[[33mwarn[0m] [0m==== local: tried[0m
[0m[[33mwarn[0m] [0m  /opt/play/repository/local/org.glassfish.hk2/hk2-utils/2.4/ivys/ivy.xml[0m
[0m[[33mwarn[0m] [0m==== Maven2 Local: tried[0m
[0m[[33mwarn[0m] [0m  file:/root/.m2/repository/org/glassfish/hk2/hk2-utils/2.4/hk2-utils-2.4.pom[0m

有趣的是,这个构建在我的开发环境中没有问题(也是 Ubuntu,我相信运行与生产环境中使用的所有内容相同的版本。)

似乎问题在于 sbt 试图检索不存在的 hk2-utils 2.4 版。我追踪到了 hk2-api 包,它的 POM 文件中包含以下内容:

<dependency>
  <groupId>org.glassfish.hk2</groupId>
  <artifactId>hk2-utils</artifactId>    
  <version>${project.version}</version>
</dependency>

我相信正在发生的事情是 ${project.version} 在我的生产环境中设置为 2.4(这是此依赖关系树根部的 jersey-client 的版本号),而不是使用它的版本号前任。 org.glassfish.hk2#hk2-api;2.2.0-b21

我想知道这是 sbt 的错误,我的 sbt 配置的错误,还是什么。我还想知道是否有任何方法可以通过配置选项或以某种方式更改 hk2-api 的 POM 来修复它。

【问题讨论】:

  • 您使用的是哪个版本的 sbt 和 Play?在 sbt 项目 sbt/sbt#647 上报告了一个类似的问题,我只是花了一些时间尝试重现它,但我无法使用 sbt 0.13.0。
  • 我正在使用带有 sbt 0.13.0 的 Play 2.2.0
  • 嗨 Eugene,我刚刚在 sbt 0.13.5 中遇到了同样的错误。似乎是导致问题的 jersey-client 版本。如果我使用 "org.glassfish.jersey.core" % "jersey-client" % "2.11" 那么我会遇到问题,但如果我将它撞到 "org.glassfish.jersey.core" % "jersey-client" % " 2.12" 然后它工作正常。

标签: java maven sbt ivy


【解决方案1】:

我对 POMS 及其工作方式并不太熟悉,因此我无法解释为什么该模块会在该版本中得到解决。但是,我重现了您的问题,并且有一个解决方法,您可以将其添加到您的 SBT 设置中。

dependencyOverrides ~= { overrides => 
  overrides + "org.glassfish.hk2" % "hk2-utils" % "2.2.0-b21" 
}

sbt 中的dependencyOverrides 设置允许您强制使用特定版本的依赖项,与其他地方指定的版本无关,无论是传递的还是显式的。事实上,即使依赖纯粹是传递地引入,它也可以工作,就像这里的情况一样。 (文档:http://www.scala-sbt.org/0.13.0/docs/Detailed-Topics/Library-Management.html#forcing-a-revision-without-introducing-a-dependency

将此添加到您的 build.sbt 应该会强制使用 2.2.0-b21 版本来解析 hk2-utils,而无需实际将其添加为项目的直接依赖项。

【讨论】:

  • 谢谢!这比将所有内容都倾倒在 lib/ 中并传递一些罐子要好。
【解决方案2】:

我在构建自定义版本的 sbt 依赖项时遇到了类似的问题。我有一个版本冲突,导致在编译期间进行虚假版本切换。清理 .ivy2/cache 后,sbt 开始捕获我的本地包就好了。

【讨论】:

    猜你喜欢
    • 2013-10-09
    • 2018-04-10
    • 2015-05-24
    • 1970-01-01
    • 2017-10-05
    • 2012-12-28
    • 2022-12-21
    • 1970-01-01
    • 2014-06-30
    相关资源
    最近更新 更多