当前位置: 首页 > 知识库问答 >
问题:

JAVAlang.IllegalArgumentException:没有实现方法::路由协议的匹配:#'clout。核心/路线

明财
2023-03-14

我有两个感兴趣的文件:build。靴子

(set-env!
 :source-paths #{"src/clj" "src/cljs" "test/clj"}
 :resource-paths #{"html" "target/main.js"}
 :dependencies '[[adzerk/boot-cljs      "0.0-3308-0"]
                 [adzerk/boot-cljs-repl "0.1.10-SNAPSHOT"]
                 [adzerk/boot-reload    "0.3.1"]
                 [adzerk/boot-test "1.0.4"]
                 [cljsjs/hammer "2.0.4-4"]
                 [compojure "1.3.1"]
                 [com.datomic/datomic-pro "0.9.5186"]
                 [hiccup "1.0.5"]
                 [org.clojure/clojure "1.7.0-RC1"]
                 [org.clojure/clojurescript "0.0-3308"]
                 [org.clojure/core.async "0.1.346.0-17112a-alpha"]
                 [org.clojure/test.check "0.7.0"]
                 [org.omcljs/om "0.8.8"]
                 [pandeiro/boot-http "0.6.3-SNAPSHOT"]
                 [ring/ring-devel "1.4.0-RC1"]
                 [http-kit "2.1.18"]])

(require
 '[adzerk.boot-cljs      :refer [cljs]]
 '[adzerk.boot-cljs-repl :refer [cljs-repl start-repl]]
 '[adzerk.boot-reload    :refer [reload]]
 '[adzerk.boot-test      :refer [test]]
 '[pandeiro.boot-http    :refer [serve]])

(task-options!
 cljs {:source-map true
       :optimizations :none
       :pretty-print true})

(deftask build
  "Build an uberjar of this project that can be run with java -jar"
  []
  (comp
   (cljs)
   (aot :namespace '#{vidiot.server})
   (pom :project 'vidiot
        :version "0.1.0")
   (uber)
   (jar :main 'vidiot.server)))

和src/clj/vidiot/server。clj

(ns vidiot.server
  (:gen-class)
  (:require
   [compojure.core :refer :all]
   [compojure.route :as route]
   [hiccup.core :refer :all]
   [org.httpkit.server :refer :all]
   [ring.middleware.reload :as reload]
   [ring.util.response :as response]))

(defonce server (atom nil))

(defroutes all-routes

  (GET "/" [] (response/redirect "index.html"))

  (GET "/ws" [request]
       (with-channel request channel
         (on-close
          channel
          (fn [status]
            (println "channel closed: " status)))

         (on-receive
          channel
          (fn [data] ;; echo it back
            (send! channel data)))))

  (route/files "/" {:root "target"})

  (route/not-found (response/response (html [:div#erro "Page Not Found"]))))

(defn -main [& args]
  (run-server all-routes {:port 8080}))

然后我,,

 > boot build
 > java -jar target/vidiot-0.1.0.jar

然后在我的浏览器中转到localhost:9090,终端打印。

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.invoke(core_deftype.clj:554)
    at clout.core$eval5590$fn__5591$G__5581__5598.invoke(core.clj:39)
    at compojure.core$if_route$fn__5887.invoke(core.clj:40)
    at compojure.core$if_method$fn__5879.invoke(core.clj:27)
    at compojure.core$routing$fn__5918.invoke(core.clj:127)
    at clojure.core$some.invoke(core.clj:2568)
    at compojure.core$routing.doInvoke(core.clj:127)
    at clojure.lang.RestFn.applyTo(RestFn.java:139)
    at clojure.core$apply.invoke(core.clj:630)
    at compojure.core$routes$fn__5922.invoke(core.clj:132)
    at org.httpkit.server.HttpHandler.run(RingHandler.java:91)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

我可以通过降级来解决这个问题:构建中的依赖项。引导至[compojure“1.1.6”]

所以,我的问题是,为什么我不能在构建uberjar时使用[compojure“1.3.4”](本文中的最新版本)?

共有2个答案

岑炯
2023-03-14

我可以通过为clout文件夹添加一个排除来解决这个问题。看起来uberjar在从项目源代码编译的文件之上解压了一些编译的clout文件。我的项目中的例子:

     (comp (cljs :compiler-options {:output-to "js/main.js"})
           (aot :namespace '#{zoondka-maps.server zoondka-maps.handler})
           (pom :project (symbol (:name project))
                :version (:version project))
           (uber :exclude (conj pod/standard-jar-exclusions #".*\.html" #"clout/.*"))
           (jar :file (str (:name project) ".jar")
                :main 'zoondka-maps.server)))
别开诚
2023-03-14

aot任务放在uber之后可以解决此问题。

(task-options! pom {:project 'my-project
                    :version "0.1.0"}
               jar {:main 'my-project.core}
               aot {:namespace '#{my-project.core}})

(deftask build []
  (comp (pom)
        (uber)
        (aot)
        (jar)))
 类似资料:
  • Tango支持4种形式的路由匹配规则 静态路由 tg.Get("/", new(Action)) tg.Get("/static", new(Action))匹配 URL:/ 到 Action结构体的Get函数 匹配 URL:/static 到 Action结构体的Get函数 命名路由 tg.Get("/:name", new(Action)) tg.Get("/(:name)", new(Act

  • 8.1. 概述 路由器主要负责解析一个请求并且决定什么module、controller、action被请求;它同时也定义了一种方法来实现用户自定义路由,这也使得它成为最重要的一个MVC组组件. 为了方便自定义路由, Yaf摒弃了0.1版本中的自定义路由器方式, 而采用了更为灵活的路由器和路由协议分离的模式. 也就是一个固定不变的路由器, 配合各种可自定义的路由协议, 来实现灵活多变的路由策略.

  • 默认路由协议 默认的路由协议Yaf_Route_Static, 就是分析请求中的request_uri, 在去除掉base_uri以后, 获取到真正的负载路由信息的request_uri片段, 具体的策略是,根据"/"对request_uri分段, 依次得到Module,Controller,Action, 在得到Module以后,还需要根据Yaf_Application::$modules来判断

  • 我是刚来香港的,所以请容忍我:)我在windows服务器上作为主机托管我的APIhttp://supermarket.xxxx.com:5000 在Ubuntu盒上添加了如下服务(http://supermarket.xxxx.com已添加到主机文件中) HTTP/1.1 201创建日期: Thu,17 Dec2020 07:11:50GMT Content-Type: Application/j

  • 注意:本部分是为v1 API编写的,但这些概念也适用于v2 API。它将在未来版本的v2 API中重新描述。 Envoy的路由匹配过程如下: HTTP请求的头域字段 host 或 :authority 与虚拟主机匹配。 按顺序检查虚拟主机中的每个路由表。如果匹配,则使用该路由并且不再匹配路由。 独立地,依次检查虚拟主机中的每个虚拟集群。如果匹配,则使用虚拟群集,不再进一步匹配集群。 返回 上一级

  • 当然, 这个世界上没有绝对的事情. 所以万一现在所有的路由协议都不能满足你的需求, 那么你可以自己实现你自己的路由协议, 你要做的是, 申明你的路由协议实现了Yaf_Route_Interface接口即可.