【问题标题】:SBT, Jetty and Servlet 3.0SBT、Jetty 和 Servlet 3.0
【发布时间】:2012-04-10 23:49:05
【问题描述】:

我有一个非常小的问题。

我有以下 build.sbt 文件:

name := "Tueet"

libraryDependencies += "org.eclipse.jetty" % "jetty-webapp" % "8.1.2.v20120308"

调用 sbt update 后,我得到以下信息:

[info] Set current project to Tueet (in build file:/C:/dev/tueet/)
[info] Updating {file:/C:/dev/tueet/}default-d5e982...
[info] Resolving org.scala-lang#scala-library;2.9.1 ...
[info] Resolving org.eclipse.jetty#jetty-webapp;8.1.2.v20120308 ...
[info] Resolving org.eclipse.jetty#jetty-xml;8.1.2.v20120308 ...
[info] Resolving org.eclipse.jetty#jetty-util;8.1.2.v20120308 ...
[info] Resolving org.eclipse.jetty#jetty-servlet;8.1.2.v20120308 ...
[info] Resolving org.eclipse.jetty#jetty-security;8.1.2.v20120308 ...
[info] Resolving org.eclipse.jetty#jetty-server;8.1.2.v20120308 ...
[info] Resolving org.eclipse.jetty.orbit#javax.servlet;3.0.0.v201112011016 ...
[info] Resolving org.eclipse.jetty#jetty-continuation;8.1.2.v20120308 ...
[info] Resolving org.eclipse.jetty#jetty-http;8.1.2.v20120308 ...
[info] Resolving org.eclipse.jetty#jetty-io;8.1.2.v20120308 ...
[warn]  [NOT FOUND  ] org.eclipse.jetty.orbit#javax.servlet;3.0.0.v201112011016!javax.servlet.orbit (603ms)
[warn] ==== public: tried
[warn]   http://repo1.maven.org/maven2/org/eclipse/jetty/orbit/javax.servlet/3.0.0.v201112011016/javax.servlet-3.0.0.v201112011016.orbit
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::              FAILED DOWNLOADS            ::
[warn]  :: ^ see resolution messages for details  ^ ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: org.eclipse.jetty.orbit#javax.servlet;3.0.0.v201112011016!javax.servlet.orbit
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[error] {file:/C:/dev/tueet/}default-d5e982/*:update: sbt.ResolveException: download     failed: org.eclipse.jetty.orbit#javax.servlet;3.0.0.v201112011016!javax.servlet.orbit
[error] Total time: 1 s, completed 2012-03-27 14:33:34

这很愚蠢,因为它在 Maven 中没有问题。我发现这是因为 Orbit 对包装做了一些事情(他们显然将其设置为轨道)。

我尝试过 exclude("org.eclipse.jetty.orbit", "javax.servlet") 但什么也没发生,它仍然需要那个依赖项。

我找不到有关如何实际解决此问题的任何信息,也许有人会在这里帮助我:)

更新:提出的错误提供了一种解决方法,因此为了解决这个问题,我实际上将 build.sbt 更改为

name := "Tueet"

libraryDependencies += "org.eclipse.jetty" % "jetty-server" % "8.1.2.v20120308"

ivyXML := 
<dependency org="org.eclipse.jetty.orbit" name="javax.servlet" rev="3.0.0.v201112011016">
<artifact name="javax.servlet" type="orbit" ext="jar"/>
</dependency>

【问题讨论】:

  • 如果修复对您没有帮助,您应该尝试清除码头的常春藤缓存。
  • 即使使用内联的 ivyXML 修复程序,我也无法正常工作
  • 谢谢@tonek!这有效:rm -rf ~/.ivy2/cache/org.eclipse.jetty.orbit

标签: servlets jetty sbt


【解决方案1】:

查看此错误:https://jira.codehaus.org/browse/JETTY-1493

问题的症结在于ivy不支持orbit扩展,需要将orbit的封装类型映射到jar。不确定你是否在那里使用了 ivy,但根本原因是一样的,你可以通过查看它从 maven Central 下载的 url 看到。

这个错误有更多背景说明我们最初切换到这些依赖项的原因。

https://bugs.eclipse.org/bugs/show_bug.cgi?id=371954

【讨论】:

  • 感谢您的信息,帮助很大!
  • 在实践中,常春藤用户正在回滚到旧版本的 Jetty:github.com/robfletcher/betamax/issues/63(这也是我们正在做的事情)。
  • 有一段时间了,我再看看这个问题,看看我们是否能找到更好的解决方案。 Eclipse 正在考虑将轨道本身变成一种对 maven 更友好的形式,这会很棒,但目前尚不清楚何时会发生这种情况以及何时可能使其成为 maven central。就我个人而言,我认为我们可以只依赖正常的工件,但是 Eclipse 基金会 IP 政策不允许这样做。
  • 我的立场是正确的:升级到 Gradle 1.4 也解决了这个问题,并且 Orbit 依赖项开箱即用。
【解决方案2】:

我找到了解决方法。更多信息可以在这里找到:SBT, Jetty and Servlet 3.0

classpathTypes ~= (_ + "orbit")

libraryDependencies ++= Seq(
  "org.eclipse.jetty.orbit" % "javax.servlet" % "3.0.0.v201112011016" % "container"         artifacts (Artifact("javax.servlet", "jar", "jar")
  )
)

libraryDependencies ++= Seq(
  "org.eclipse.jetty" % "jetty-webapp" % "8.1.4.v20120524" % "container" artifacts            (Artifact("jetty-webapp", "jar", "jar"))
)

【讨论】:

  • 你不需要为 jetty-webapp 覆盖工件
【解决方案3】:

使用 sbt 0.12+(来自:https://github.com/sbt/sbt/issues/499

libraryDependencies ++= Seq(
    "org.eclipse.jetty" % "jetty-webapp" % "8.1.7.v20120910" % "container",
    "org.eclipse.jetty.orbit" % "javax.servlet" % "3.0.0.v201112011016" % "container" artifacts Artifact("javax.servlet", "jar", "jar")
)

【讨论】: