当包含datomic依赖项时,lein ring server-headless无法启动

4

我的目标是使用compojure创建一个web应用程序,并将datomic作为数据库附加到其中。单独使用这两个组件都很好。然而,当我尝试使用lein ring server-headless启动服务器(包括datomic作为依赖项)时,会出现巨大的错误。错误输出的头部如下:

Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/jetty/util/component/AggregateLifeCycle, compiling:(ring/adapter/jetty.clj:1:1)
    at clojure.lang.Compiler.load(Compiler.java:7391)
    at clojure.lang.RT.loadResourceScript(RT.java:372)
    at clojure.lang.RT.loadResourceScript(RT.java:363)
    at clojure.lang.RT.load(RT.java:453)
    at clojure.lang.RT.load(RT.java:419)
    at clojure.core$load$fn__5677.invoke(core.clj:5893)

使用 project.clj 文件

(defproject pinvest "0.1.0-SNAPSHOT"
  :description "foobar"
  :min-lein-version "2.0.0"
  :dependencies [[org.clojure/clojure "1.8.0"]
                 [org.clojure/core.async "0.3.442"]
                 [org.clojure/tools.namespace "0.2.11"]
                 [compojure "1.5.1"]
                 [ring/ring-defaults "0.2.1"]
                 [com.datomic/clj-client "0.8.606"]]
  :plugins [[lein-ring "0.9.7"]]
  :ring {:handler pinvest.handler/app}
  :profiles
  {:dev {:dependencies [[javax.servlet/servlet-api "2.5"]
                        [ring/ring-mock "0.3.0"]]}})

最初使用lein new compojure foo生成。

依赖项com.datomic/clj-client导致启动服务器时出现问题。

我尝试通过在project.clj中进行排除某些依赖关系来解决问题。

[com.datomic/clj-client "0.8.606"
    :exclusions [org.eclipse.jetty/jetty-http
                 org.eclipse.jetty/jetty-util
                 org.eclipse.jetty/jetty-client]]

但这只会导致

的结果。
clojure.lang.Compiler$CompilerException: java.lang.ClassNotFoundException: org.eclipse.jetty.client.HttpClient, compiling:(cognitect/http_client.clj:1:1)

任何帮助都将不胜感激。
PS. 我是clojure的新手,这些错误信息简直无法理解。

com.datomic/clj-client "0.8.606" 应该与哪个版本的 Jetty 兼容? - Chris Murphy
运行 lein deps :tree 命令会输出以下依赖项: [org.eclipse.jetty/jetty-client "9.3.7.v20160115][org.eclipse.jetty/jetty-io "9.3.7.v20160115"][org.eclipse.jetty/jetty-http "9.3.7.v20160115"][org.eclipse.jetty/jetty-util "9.3.7.v20160115"] - lsund
我也知道我的环境版本正在使用Jetty的7.x版本。 - lsund
能否为了调试,进入.m2并停用没有AggregateLifeCycle.class的版本(9.3.7)?比如说,用一个空的jar文件替换它,找出是什么引入了你想要摆脱的jetty-util的9.3.7版本。然后,也许你可以回到依赖于9.3.7的旧版本,试图解决这个三角依赖问题。我原以为lein deps :tree会显示确切的问题——需要9.3.7的是什么。你需要将其降级(这样jetty-util也会被降级),或者排除其对jetty-util的依赖。 - Chris Murphy
需要9.3.7版本的是com.datomic/clj-client。该库通过maven中央仓库提供。然而,它似乎只显示软件包的最新版本。你知道如何获取早期版本吗? - lsund
显示剩余4条评论
3个回答

1

我也遇到了这个问题,但找不到解决方法。据我所知,看起来ring-core正在使用较旧的jetty适配器以保持兼容性。目前,我已经找到了一个值得替换成为ring依赖项的https://github.com/sunng87/ring-jetty9-adapter,并且在我的设置中没有发现其他问题:

[com.datomic/clj-client "0.8.606" :exclusions [org.eclipse.jetty/jetty-http org.eclipse.jetty/jetty-util org.eclipse.jetty/jetty-client]]
[info.sunng/ring-jetty9-adapter "0.10.0"]

1

尽量不要使用jetty。来自Slack群的某人遇到了非常相似的问题,现在使用以下组合(http-kit代替jetty):

[com.datomic/datomic-free "0.9.5544"] [ring/ring-core "1.5.0"] [http-kit "2.2.0"]


Datomic的clj-client依赖于Jetty。如果我清除Jetty,就会得到“CompilerException java.lang.ClassNotFoundException: org.eclipse.jetty.client.HttpClient, compiling:(cognitect/http_client.clj:1:1)”错误信息。 - lsund
这个解决方案对我有用。我和原帖作者遇到了同样的问题。 - Jason
嗯...所以在我从datomic-free切换到datomic client (clj-client)之后它没有起作用,我需要使用客户端库。 - Jason

1
这很奇怪。对我来说:exclusion起作用了(但我看它对你没有起作用)。这里有文档
[com.datomic/client-pro "0.8.28"
                    :exclusions [org.eclipse.jetty/jetty-client
                                org.eclipse.jetty/jetty-http
                                org.eclipse.jetty/jetty-util]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接