【问题标题】:lein ring server-headless fails when including datomic dependency包含 datomic 依赖项时,lein ring server-headless 失败
【发布时间】:2017-09-03 14:27:40
【问题描述】:

我的目标是使用 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" 应该使用哪个版本的码头?
  • 使用 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"]
  • 你能在本地 .m2 maven repo 的 jar 文件中看到 AggregateLifeCycle 类文件吗?如果它在指向的 jar 文件之一(可能是 jetty-util)中不存在,则错误消息是有意义的。
  • 我检查了 m2 存储库中的所有 jar 文件。原来 `org/eclipse/jetty-util/ 包含两个版本。 7.6.13.v20130916 和 9.3.7.v20160115。只有 7.x 版本包含 AggregateLifeCycle 类文件。
  • 我该如何解决这个依赖问题?

标签: clojure compojure ring datomic


【解决方案1】:

这很奇怪。 :exclusion 为我工作(但我发现它不适合你)。记录在案here

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

【讨论】:

    【解决方案2】:

    我也遇到了这个问题,找不到解决方法。据我了解,看起来 ring-core 正在使用旧的码头适配器用于遗留目的。到目前为止,我发现 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"]
    

    【讨论】:

      【解决方案3】:

      尽量不要使用码头。 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。如果我正在清理码头,我会收到CompilerException java.lang.ClassNotFoundException: org.eclipse.jetty.client.HttpClient, compiling:(cognitect/http_client.clj:1:1)
      • 这个解决方案对我有用。我遇到了和 OP 一样的问题。
      • 嗯...所以在我从 datomic-free 切换到 datomic 客户端 (clj-client) 后它不起作用,我需要使用客户端库。
      猜你喜欢
      • 2014-08-19
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多