【问题标题】:No implementation of method error when running lein-rpm task运行 lein-rpm 任务时没有实现方法错误
【发布时间】:2017-07-12 12:32:33
【问题描述】:

从我的 clojure 项目中,我正在使用 lein uberjar 创建 jar,该 jar 在本地运行良好。

然后我通过 lein-rpm 任务创建一个 rpm,然后我将 rpm 部署到服务器。

部署 rpm 后,我尝试使用 java -jar 运行它,但服务开始出现以下异常。

java.lang.IllegalArgumentException: No implementation of method: :route-matches of protocol: #'clout.core/Route found for class: clout.core.CompiledRoute
        at clojure.core$_cache_protocol_fn.invokeStatic(core_deftype.clj:566) ~[na:na]
        at clojure.core$_cache_protocol_fn.invoke(core_deftype.clj:560) ~[na:na]
        at clout.core$eval5959$fn__5960$G__5950__5967.invoke(core.clj:39) ~[na:na]
        at compojure.core$route_matches.invokeStatic(core.clj:46) ~[na:na]
        at compojure.core$route_matches.invoke(core.clj:44) ~[na:na]
        at compojure.core$route_request.invokeStatic(core.clj:49) ~[na:na]
        at compojure.core$route_request.invoke(core.clj:48) ~[na:na]
        at compojure.core$wrap_route_matches$fn__6362.invoke(core.clj:145) ~[na:na]
        at compojure.core$wrap_routes$fn__6478.invoke(core.clj:348) ~[na:na]
        at compojure.api.routes.Route.invoke(routes.clj:74) [na:na]
        at compojure.api.core$handle$fn__17370.invoke(core.clj:8) ~[na:na]
        at clojure.core$some.invokeStatic(core.clj:2592) [na:na]
        at clojure.core$some.invoke(core.clj:2583) [na:na]
        at compojure.api.core$handle.invokeStatic(core.clj:8) ~[na:na]
        at compojure.api.core$handle.invoke(core.clj:7) ~[na:na]
        at clojure.core$partial$fn__533.invoke(core.clj:2515) ~[na:na]
        at compojure.api.routes.Route.invoke(routes.clj:74) [na:na]
        at ring.swagger.middleware$wrap_swagger_data$fn__14534.invoke(middleware.clj:33) ~[na:na]
        at ring.middleware.http_response$wrap_http_response$fn__11869.invoke(http_response.clj:19) ~[na:na]
        at ring.swagger.middleware$wrap_swagger_data$fn__14534.invoke(middleware.clj:33) ~[na:na]
        at compojure.api.middleware$wrap_options$fn__15814.invoke(middleware.clj:74) [na:na]
        at ring.middleware.format_params$wrap_format_params$fn__10747.invoke(format_params.clj:119) ~[na:na]
        at ring.middleware.format_params$wrap_format_params$fn__10747.invoke(format_params.clj:119) ~[na:na]
        at ring.middleware.format_params$wrap_format_params$fn__10747.invoke(format_params.clj:119) ~[na:na]
        at ring.middleware.format_params$wrap_format_params$fn__10747.invoke(format_params.clj:119) ~[na:na]
        at ring.middleware.format_params$wrap_format_params$fn__10747.invoke(format_params.clj:119) ~[na:na]
        at compojure.api.middleware$wrap_exceptions$fn__15804.invoke(middleware.clj:43) ~[na:na]
        at ring.middleware.format_response$wrap_format_response$fn__11767.invoke(format_response.clj:183) [na:na]
        at ring.middleware.keyword_params$wrap_keyword_params$fn__11907.invoke(keyword_params.clj:36) [na:na]
        at ring.middleware.nested_params$wrap_nested_params$fn__11955.invoke(nested_params.clj:89) [na:na]
        at ring.middleware.params$wrap_params$fn__12029.invoke(params.clj:67) [na:na]
        at compojure.api.middleware$wrap_options$fn__15814.invoke(middleware.clj:74) [na:na]
        at compojure.api.routes.Route.invoke(routes.clj:74) [na:na]
        at clojure.lang.Var.invoke(Var.java:379) [supply-planning-api-service-standalone.jar:na]
        at compojure.core$routing$fn__6377.invoke(core.clj:185) [na:na]
        at clojure.core$some.invokeStatic(core.clj:2592) [na:na]
        at clojure.core$some.invoke(core.clj:2583) [na:na]
        at compojure.core$routing.invokeStatic(core.clj:185) [na:na]
        at compojure.core$routing.doInvoke(core.clj:182) [na:na]

库和环境详细信息

lein-rpm - 0.0.5

操作系统 - CentOS Linux 7

我错过了什么?

编辑:

根据@Mrinal 的评论,我在 rpm 构建前后检查了 jar 大小。如果我们从 rpm 中提取 jar,大小会比原来的小一点。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    我遇到了同样的问题。花了两天时间解决。

    所以如果你看到lein uberjar 和 lein rpm 任务生成的 jar 大小,它们会有所不同。罪魁祸首是 brp-java-repack-jars,它在 rpm 构建期间打包和重新打包 jar。要查看您需要在终端上运行 rpm -E '%{__os_install_post}' 的选项,您将看到如下内容:

    /usr/lib/rpm/redhat/brp-compress 
    /usr/lib/rpm/redhat/brp-strip /usr/bin/strip 
    /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump 
    /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip 
    /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1 
    /usr/lib/rpm/redhat/brp-python-hardlink 
    /usr/lib/rpm/redhat/brp-java-repack-jars
    

    最后一个是问题,因为它与 lein uberjar 创建的 jar 混淆了。为了摆脱这个问题,我们必须在 rpm 创建期间禁用 __os_install_post 选项。这个blog 解释的很好。

    我们所做的是,去掉 rpm 步骤,将 lein uberjar 步骤创建的 .jar 包直接复制到服务器并运行它。但是我们已经尝试过这个其他选项,它也可以工作。

    希望这会有所帮助。如有任何疑问,请 Ping cmets。

    【讨论】:

    • 感谢您的即时回复。你是对的,brp-java-repack-jars 只是导致问题,所以我们删除了包的 RPM 选项。
    • 很高兴我能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 2020-04-22
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多