Clojure &引用;SSL不';“没有有效的密钥库”;尝试连接到Datomic Cloud时出错
我正试图转换一个项目来使用新的。我已经通过AWS仪表板创建了这个堆栈,甚至可以通过一个简单的clojure repl连接到它,并具有所需的依赖项。但我一直很难从我的项目中获得工作上的联系 起初,我遇到了一系列依赖性冲突——实际上,这可能仍然是这里的根本问题——因此我在我的Clojure &引用;SSL不';“没有有效的密钥库”;尝试连接到Datomic Cloud时出错,clojure,jetty,datomic,Clojure,Jetty,Datomic,我正试图转换一个项目来使用新的。我已经通过AWS仪表板创建了这个堆栈,甚至可以通过一个简单的clojure repl连接到它,并具有所需的依赖项。但我一直很难从我的项目中获得工作上的联系 起初,我遇到了一系列依赖性冲突——实际上,这可能仍然是这里的根本问题——因此我在我的项目中包含datomic项目时添加了一些排除项。clj: [com.datomic/client-cloud "0.8.50" :exclusions [org.eclipse.jetty/jetty-io
项目中包含datomic项目时添加了一些排除项。clj
:
[com.datomic/client-cloud "0.8.50"
:exclusions [org.eclipse.jetty/jetty-io
org.eclipse.jetty/jetty-util
commons-logging
commons-codec]]
然后,当我试图在lein repl
中与
(require '[datomic.client.api :as d])
(def cfg {:server-type :cloud
:region "us-east-2"
:system "<sysname>"
:query-group "<sysname>"
:endpoint "http://entry.<sysname>.us-east-2.datomic.net:8182/"
:proxy-port 8182})
(def client (d/client cfg))
(需要“[datomic.client.api:as d])
(def cfg{:服务器类型:云)
:地区“美国东部-2”
:系统“”
:查询组“”
:端点“http://entry..us-east-2.datomic.net:8182/"
:代理端口8182})
(def客户端(d/客户端cfg))
我最后犯了以下错误:
2018-05-13 20:36:01.593:警告:oejuc.抽象生命周期:nREPL-worker-1:失败SslContextFactory@56f447c4(null,null):java.lang.IllegalStateException:SSL没有有效的密钥库>
java.lang.IllegalStateException:SSL没有有效的密钥库`
这件事难倒我了。这是一个具有完整堆栈跟踪的粘贴箱:。我猜可能是jetty的错误版本出现了问题,但我不确定下一步该怎么做。想法?根据@Aleph-Aleph在对上述问题的评论中提出的建议,我找到了解决方案。我所做的是向与
datomic/cloud-client
冲突的依赖项的包中添加排除项
我通过更仔细地查看lein deps:tree | grep jetty
来查看这些冲突。它特别表明了以下几点:
[ring "1.6.3" :exclusions [org.eclipse.jetty/jetty-client org.eclipse.jetty/jetty-http org.eclipse.jetty/jetty-util]] -> [ring/ring-jetty-adapter "1.6.3"] -> [org.eclipse.jetty/jetty-server "9.2.21.v20170120"] -> [org.eclipse.jetty/jetty-
io "9.2.21.v20170120"]
overrides
[com.datomic/client-cloud "0.8.50"] -> [com.datomic/client "0.8.40"] -> [com.datomic/client-impl-shared "0.8.34"] -> [com.cognitect/http-client "0.1.83"] -> [org.eclipse.jetty/jetty-client "9.3.7.v20160115"] -> [org.eclipse.jetty/jetty-io
"9.3.7.v20160115"]
and
[com.datomic/client-cloud "0.8.50"] -> [com.datomic/client-impl-shared "0.8.34"] -> [com.cognitect/http-client "0.1.83"] -> [org.eclipse.jetty/jetty-client "9.3.7.v20160115"] -> [org.eclipse.jetty/jetty-io "9.3.7.v20160115"]
and
[com.datomic/client-cloud "0.8.50"] -> [com.datomic/client "0.8.40"] -> [com.cognitect/http-client "0.1.83"] -> [org.eclipse.jetty/jetty-client "9.3.7.v20160115"] -> [org.eclipse.jetty/jetty-io "9.3.7.v20160115"]
很明显,来自ring
的依赖项称为ring/ring-jetty-adapter
包含一些包版本,这些包版本覆盖了datomic云中的包版本。因此,我添加了以下内容,以解决问题:
[ring "1.6.3"
:exclusions [ring/ring-jetty-adapter]]
如果您为
jetty服务器
和jetty客户端
指定了较新的依赖项版本,它最终应该可以工作。
这就是我的工作原理:
:dependencies [[org.clojure/clojure "1.9.0"]
[ring/ring-core "1.7.0-RC1"]
[ring/ring-jetty-adapter "1.7.0-RC1"]
[org.eclipse.jetty/jetty-server "9.4.9.v20180320"]
[org.eclipse.jetty/jetty-client "9.4.9.v20180320"]
[com.datomic/client-cloud "0.8.52"]]
有关完整的演示,请参见我的解决方法是使用alter var root+替换ssl上下文工厂实现,以使用以下依赖项:
org.eclipse.jetty/jetty-http {:mvn/version "9.2.24.v20180105"}
org.eclipse.jetty/jetty-io {:mvn/version "9.2.24.v20180105"}
org.eclipse.jetty/jetty-util {:mvn/version "9.2.24.v20180105"}
org.eclipse.jetty/jetty-client {:mvn/version "9.2.24.v20180105"}
缺点是现在它信任一切,但也许可以找到一些最佳配置
(defn ssl-context-factory-replacement
^SslContextFactory [{:keys [trust-all classpath-trust-store trust-store-password trust-store validate-hostnames]}]
(SslContextFactory. true))`enter code here`
(alter-var-root
#'cognitect.http-client/ssl-context-factory
(constantly ssl-context-factory-replacement))
我会尝试不在
com.datomic/client cloud
中排除Jetty,而是在其他需要它的依赖项中排除Jetty,这样您就可以得到一个可与datomic cloud相比的Jetty版本。我并不完全理解您的意思。有没有可能提供一个简短的示例?运行leindeps:tree
查看哪些库需要Jetty。然后,将[org.eclipse.jetty/jetty-io org.eclipse.jetty/jetty util]
从问题文本中列出的com.datomic/client cloud
依赖项的排除项中删除,并为依赖jetty的其他库添加这些排除项。好的,我来试一试。这一变化的影响是datomic云库指定的jetty包的版本会被优先考虑吗?结果证明这并没有解决我的问题。我只考了一个repl。码头的排除破坏了环形服务器。因此,我回来尝试解决依赖冲突。在上面的输出中,您似乎从ring
获得了jetty io
依赖关系。如果这不是您想要的,那么将此工件添加到:exclusions
向量中。可能一个不太容易出错的选项是完全放弃排除,并使用正确的版本声明对环形/环形码头适配器的显式依赖关系(在项目.clj
)(我猜9.3.7.v20160115
或与datomic兼容的类似产品)+1.这对我来说很有用。我不喜欢在我的deps向量中存在我的应用程序不直接需要的依赖项,但哦,好吧。