sbt托管依赖项检索错误的版本

时间:2013-12-03 02:03:08

标签: java maven sbt ivy

我正在通过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。

2 个答案:

答案 0 :(得分: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,而不实际将其添加为项目的直接依赖项。

答案 1 :(得分:0)

当我构建自定义版本的sbt依赖时,我遇到了类似的问题。我有一个版本冲突导致编译期间虚假版本切换。清理完.ivy2 / cache sbt开始抓住我的本地软件包就好了。