2015-06-19 2 views
1

Я разрабатываю простой веб-приложение hello world в Clojure. Однако после того, как я добавил библиотеку Schema в свой проект, я начал получать ошибку ниже при попытке построить uberjar с помощью lein uberjar. Как ни странно, приложение все еще проходит модульные тесты и работает без ошибок при запуске с использованием lein dev.Схема, вызывающая ошибку сборки uberimage

java.lang.RuntimeException: Не удается разрешить символ: недостающих-требуется ключ в этом контексте компиляции: (сервер/api.clj: 21: 17) в clojure.lang.Compiler.analyze (Compiler.java:6464) в clojure.lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ VectorExpr.parse (Compiler.java:3126) в clojure.lang.Compiler.analyze (Compiler.java:6447) в clojure.lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ MapExpr.parse (Compiler.java:2981) в clojure.lang.Compiler.analyze (Compiler.java:6453) в clojure.lang.C ompiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ MapExpr.parse (Compiler.java:2981) в clojure.lang.Compiler.analyze (Compiler.java:6453) в clojure.lang. Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ InvokeExpr.parse (Compiler.java:3719) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6646) в clojure.lang. Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.access $ 100 (Compiler.java:38) в clojure.lang.Compiler $ LetExpr $ Parser.parse (Compiler.java:6050) в clojure .lang.Compiler.analyzeSeq (Compiler.java:6644) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyzeSeq (Compil er.java:6632) на clojure.lang.Compiler.analyze (Compiler.java:6445) на clojure.lang.Compiler.analyze (Compiler.java:6406) на clojure.lang.Compiler $ InvokeExpr.parse (Compiler.java:3719) на clojure.lang.Compiler.analyzeSeq (Compiler.java:6646) на clojure.lang.Compiler.analyze (Compiler.java:6445) на clojure.lang.Compiler.analyze (компилятор. java: 6406) at clojure.lang.Compiler $ BodyExpr $ Parser.parse (Compiler.java:5782) в clojure.lang.Compiler $ LetExpr $ Parser.parse (Compiler.java:6100) в clojure.lang. Compiler.analyzeSeq (Compiler.java:6644) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) a t clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ BodyExpr $ Parser.parse (Compiler.java: 5782) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6644) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyze (Compiler.java:6406) at clojure.lang.Compiler $ BodyExpr $ Parser.parse (Compiler.java:5782) в clojure.lang.Compiler $ LetExpr $ Parser.parse (Compiler.java:6100) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6644) на clojure.lang.Compiler.analyze (Compiler.java:6445) на clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) на clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ BodyExpr $ Parser.parse (Compiler.java:5782)) на clojure.lang.Compiler $ LetExpr $ Parser.parse (Compiler.java:6100) на clojure.lang.Compiler.analyzeSeq (Compiler.java:6644) на clojure.lang.Compiler.проанализируйте (Compiler.java:6445) по адресу clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) на clojure.lang.Compiler.analyze (Compiler.java:6445) на clojure.lang.Compiler.analyze (Compiler.java:6406) на clojure.lang.Compiler $ BodyExpr $ Parser. parse (Compiler.java:5782) в clojure.lang.Compiler $ LetExpr $ Parser.parse (Compiler.java:6100) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6644) в clojure.lang. Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) в clojure.lang.Compiler.analyze (Compiler.java : 6445) на clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) на clojure.lang.Compiler.analyze (Compiler.java:6445) на clojure.lang.Compiler.analyze (Compiler.java:6406)) в clojure.lang.Compiler $ BodyExpr $ Parser.parse (Compiler.java:5782) в clojure.lang.Compiler $ FnMethod.parse (Compiler.java:5217) в clojure.lang.Compiler $ FnExpr.parse (Compiler.java:3846) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6642) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyzeSeq (компилятор .java: 6632) на clojure.lang.Compiler.analyze (Compiler.java:6445) на clojure.lang.Compiler.analyze (Compiler.java:6406) на clojure.lang.Compiler $ InvokeExpr.parse (Compiler.java:3719) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6646) в clojure.lang.Compiler.analyze (Compiler.java:6445) at clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) при clojure.lang.Compiler.analyze (Compiler.java:6445) при clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) в Clojure .lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ InvokeExpr.parse (Compiler.java:3719) в clojure .lang.Compiler.analyzeSeq (Compiler.java:6646) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang .Compiler.analyzeSeq (Compiler.java:6632) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ InvokeExpr.parse (Compiler.java:3719) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6646) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler .analyze (Compiler.java:6406) в clojure.lang.Compiler $ InvokeExpr.parse (Compiler.java:3719) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6646) в clojure.lang.Compiler .analyze (Compiler.java:6445) в clojure.lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ InvokeExpr.parse (Compi ler.java:3719) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6646) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyzeSeq (компилятор. java: 6632) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) в clojure.lang.Compiler.analyze (Compiler.java: 6445) в clojure.lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ InvokeExpr.parse (Compiler.java:3719) в clojure.lang.Compiler.analyzeSeq (Compiler.java: 6646) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyze (компилятор.java: 6406) в clojure.lang.Compiler $ InvokeExpr.parse (Compiler.java:3719) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6646) в clojure.lang.Compiler.analyze (компилятор. java: 6445) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyze (Compiler.java: 6406) в clojure.lang.Compiler $ InvokeExpr.parse (Compiler.java:3719) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6646) в clojure.lang.Compiler.analyze (Compiler.java: 6445) на clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) на clojure.lang.Compiler.analyze (Compiler.java:6445) на clojure.lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ BodyExpr $ Parser.parse (Compiler.java:5782) в clojure.lang.Compiler $ FnMethod.parse (Compiler.java : 5217) на clojure.lang.Compiler $ FnExpr.parse (Compiler.java:3846) на clojure.lang.Compiler.analyzeSeq (Compiler.java:6642) на clojure.lang.Compiler.analyze (Compiler.java : 6445) на clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) на clojure.lang.Compiler.analyze (Compiler.java:6445) на clojure.lang.Compiler.access $ 100 (Compiler.java: 38) в clojure.lang.Compiler $ DefExpr $ Parser.parse (Compiler.java:538) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6644) по адресу clojure.lang.Compiler.analyze (Compiler.java:6445) на clojure.lang.Compiler.analyze (Compiler.java:6406) на clojure.lang.Compiler.compile1 (Compiler.java:7221) на clojure .lang.Compiler.compile (Compiler.java:7292) на clojure.lang.RT.compile (RT.java:398) на clojure.lang.RT.load (RT.java:438) на clojure.lang .RT.load (RT.java:411) на clojure.core $ load $ fn__5066.invoke (core.clj: 5641) на clojure.core $ load.doInvoke (core.clj: 5640) на clojure.lang .RestFn.invoke (RestFn.java:408) в clojure.core $ load_one.invoke (core.clj: 5446) на clojure.core $ compile $ fn__5071.invoke (core.clj: 5652) на clojure.core $ compile.invoke (ядро. clj: 5651) at пользователь $ eval9 $ fn__16.invoke (form-init1857067608391167398.clj: 1) at пользователь $ eval9.invoke (form-init1857067608391167398.clj: 1) at clojure.lang.Compiler.eval (компилятор. java: 6703) на clojure.lang.Compiler.eval (Compiler.java:6693) на clojure.lang.Compiler.load (Compiler.java:7130) на clojure.lang.Compiler.loadFile (Compiler.java: 7086) в clojure.main $ load_script.invoke (main.clj: 274) at clojure.main $ init_opt.invoke (main.clj: 279) at clojure.main $ initialize.invoke (main.clj: 307) at clojure.main $ null_opt.invoke (main.clj: 342) at clojure.main $ main.doInvoke (main.clj: 420) at clojure.lang.RestFn.invoke (RestFn.java:421) на clojure.lang.Var.invoke (Var.java:383) при clojure.lang.AFn.applyToHelper (AFn.java:156) при clojure.lang.Var.applyTo (Var.java:700) в clojure.main.main (main.java:37) Вызвано: java.lang.RuntimeException: Невозможно разрешить символ: missing-required-key в этом контексте на clojure.lang.Util.runtimeException (Util.java:221) в clojure.lang.Compiler.resolveIn (Compiler.java:6940) в clojure.lang.Compiler.resolve (Compiler.java:6884) в clojure.lang.Compiler.analyzeSymbol (Compiler.java:6845) в clojure.lang.Compiler.analyze (Compiler.java:6427) ... 153 еще Исключение в теме "main" java.lang.RuntimeException: Невозможно присвоить символ разрешения: missing-required-key в этом контексте, компиляция: (server/api.clj: 21: 17) в clojure.lang.Compiler.analyze (Compiler.java:6464) в clojure .lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ VectorExpr.parse (Compiler.java:3126) в clojure.lang.Compiler.analyze (Compiler.java:6447) в clojure .lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ MapExpr.parse (Compiler.java:2981) в clojure.lang.Compiler.analyze (Compiler.java:6453) в clojure .lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ MapExpr.parse (Compiler.java:2981) в clojure.lang.Compiler.analyze (Compiler.java:6453) в clojure.lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ InvokeExpr.parse (Compiler.java:3719) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6646) при clojure.lang.Compiler.analyze (Compiler.java:6445) при clojure.lang.Compiler.access $ 100 (Compiler.java:38) в clojure.lang.Compiler $ LetExpr $ Parser.parse (Compiler.java:6050) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6644) в clojure.lang.Compiler.analyze (Compiler.java:6445) на clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) на clojure.lang.Compiler.analyze (Compiler.java:6445) на clojure.lang.Compiler. проанализируйте (Compiler.java:6406) в clojure.lang.Compiler $ InvokeExpr.parse (Compiler.java:3719) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6646) в clojure.lang.Compiler. проанализируйте (Compiler.java:6445) в clojure.lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ BodyExpr $ Parser.parse (Compiler.java:5782) в clojure.lang. Компилятор $ LetExpr $ Parser.parse (Compiler.java:6100) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6644) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure. lang.Compiler.analyzeSeq (Compiler.java:6632) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyze (компиляция r.java:6406) в clojure.lang.Compiler $ BodyExpr $ Parser.parse (Compiler.java:5782) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6644) в clojure.lang.Compiler. проанализируйте (Compiler.java:6445) по адресу clojure.lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ BodyExpr $ Parser.parse (Compiler.java:5782) в clojure.lang. Компилятор $ LetExpr $ Parser.parse (Compiler.java:6100) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6644) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure. lang.Compiler.analyzeSeq (Compiler.java:6632) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyze (Compiler.java:640 6) в clojure.lang.Compiler $ BodyExpr $ Parser.parse (Compiler.java:5782) в clojure.lang.Compiler $ LetExpr $ Parser.parse (Compiler.java:6100) в clojure.lang.Compiler. analySeq (Compiler.java:6644) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) в clojure.lang.Compiler.analyze (компилятор.ява: 6644) Compiler.java:6445) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyze (компилятор. java: 6406) at clojure.lang.Compiler $ BodyExpr $ Parser.parse (Compiler.java:5782) в clojure.lang.Compiler $ LetExpr $ Parser.parse (компилятор.java: 6100) на clojure.lang.Compiler.analyzeSeq (Compiler.java:6644) на clojure.lang.Compiler.analyze (Compiler.java:6445) на clojure.lang.Compiler.analyzeSeq (Compiler.java: 6632) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) в clojure.lang.Compiler.analyze (Compiler.java:6445) at clojure.lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ BodyExpr $ Parser.parse (Compiler.java:5782) в clojure.lang.Compiler $ FnMethod.parse (компилятор. java: 5217) на clojure.lang.Compiler $ FnExpr.parse (Compiler.java:3846) на clojure.lang.Compiler.analyzeSeq (Compiler.java:6642) на clojure.lang.Compiler.analyze (Compiler.java:6445) при clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) при clojure.lang.Compiler.analyze (Compiler.java:6445) при Clojure .lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ InvokeExpr.parse (Compiler.java:3719) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6646) в clojure .lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang .Compiler.analyzeSeq (Compiler.java:6632) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Co mpiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ InvokeExpr.parse (Compiler.java:3719) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6646) в clojure.lang. Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler. проанализируйте (Compiler.java:6406) в clojure.lang.Compiler $ InvokeExpr.parse (Compiler.java:3719) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6646) в clojure.lang.Compiler. проанализируйте (Compiler.java:6445) в clojure.lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ InvokeExpr.parse (компилятор .java: 3719) at clojure.lang.Compiler.analyzeSeq (Compiler.java:6646) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyze (Compiler.java : 6406) в clojure.lang.Compiler $ InvokeExpr.parse (Compiler.java:3719) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6646) в clojure.lang.Compiler.analyze (Compiler.java : 6445) на clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) на clojure.lang.Compiler.analyze (Compiler.java:6445) на clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyze (Compiler.java:6406) по адресу clojure.lang.Compiler $ InvokeExpr.parse (Compiler.java:3719) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6646) в clojure.lang.Compiler.analyze (Compiler.java:6445) at clojure.lang.Compiler.analyze (Compiler.java:6406) at clojure.lang.Compiler $ InvokeExpr.parse (Compiler.java:3719) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6646) at clojure.lang.Compiler.analyze (Compiler.java:6445) при clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) при clojure.lang.Compiler.analyze (Compiler.java:6445) при Clojure .lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ InvokeExpr.parse (Compiler.java:3719) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6646) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) в clojure.lang.Compiler. проанализируйте (Compiler.java:6445) в clojure.lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler $ BodyExpr $ Parser.parse (Compiler.java:5782) в clojure.lang. Компилятор $ FnMethod.parse (Compiler.java:5217) в clojure.lang.Compiler $ FnExpr.parse (Compiler.java:3846) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6642) в clojure. lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyzeSeq (Compiler.java:6632) в clojure.lang.Compiler.analyze (Compil er.java:6445) at clojure.lang.Compiler.access $ 100 (Compiler.java:38) в clojure.lang.Compiler $ DefExpr $ Parser.parse (Compiler.java:538) в clojure.lang.Compiler .analyzeSeq (Compiler.java:6644) в clojure.lang.Compiler.analyze (Compiler.java:6445) в clojure.lang.Compiler.analyze (Compiler.java:6406) в clojure.lang.Compiler.compile1 (Compiler.java:7221) на clojure.lang.Compiler.compile (Compiler.java:7292) на clojure.lang.RT.compile (RT.java:398) на clojure.lang.RT.load (RT .java: 438) at clojure.lang.RT.load (RT.java:411) at clojure.core $ load $ fn__5066.invoke (core.clj: 5641) at clojure.core $ load.doInvoke (core .clj: 56 40) в clojure.lang.RestFn.invoke (RestFn.java:408) в clojure.core $ load_one.invoke (core.clj: 5446) в clojure.core $ compile $ fn__5071.invoke (core.clj: 5652) на clojure.core $ compile.invoke (core.clj: 5651) на пользователь $ eval9 $ fn__16.invoke (form-init1857067608391167398.clj: 1) на пользователь $ eval9.invoke (form-init1857067608391167398.clj: 1) в clojure.lang.Compiler.eval (Compiler.java:6703) в clojure.lang.Compiler.eval (Compiler.java:6693) в clojure.lang.Compiler.load (Compiler.java:7130) at clojure.lang.Compiler.loadFile (Compiler.java:7086) at clojure.main $ load_script.invoke (main.clj: 274) at clojure.main $ init_opt.invoke (main.clj : 279) at clojure.main $ initialize.invoke (main.clj: 307) at clojure.main $ null_opt.invoke (main.clj: 342) at clojure.main $ main.doInvoke (main.clj: 420) в clojure.lang.RestFn.invoke (RestFn.java:421) в clojure.lang.Var.invoke (Var.java:383) в clojure.lang.AFn.applyToHelper (AFn.java:156) at clojure.lang.Var.applyTo (Var.java:700) at clojure.main.main (main.java:37) Причиняется: java.lang.RuntimeException: Невозможно разрешить символ: missing-required-key in этот контекст на clojure.lang.Util.runtimeException (Util.java:221) на clojure.lang.Compiler.resolveIn (Compiler.java:6940) на clojure.lang.Compiler.resolve (Compiler.java: 6884) в clojure.lang.Compiler.analyzeSymbol (Compiler.java:6845) в clojure.lang.Compiler.analyze (Compiler.java:6427) ... 153 более Компиляция не удалось: неуспешна

Ниже приведен исходный файл, в котором я использую схему. Для краткости я опустил остальные исходные файлы, но если кто-то хочет увидеть остальное, просто спросите.

(ns server.api 
    (:require [aleph.http :as http] 
      [compojure.api.sweet :refer :all] 
      [compojure.route :as route] 
      [com.stuartsierra.component :as component] 
      [ring.middleware.reload :refer [wrap-reload]] 
      [ring.util.http-response :refer :all] 
      [schema.core :as s] 
      [server.logging :refer [wrap-exception-logging wrap-request-logging] :as log])) 

(s/defschema Greeting 
    {:hello s/Str 
    s/Keyword s/Any}) 

(defn app [db] 
    (api 
    {:format {:formats [:json-kw]}} 
    (middlewares [wrap-request-logging 
       wrap-exception-logging] 
       (swagger-ui "/docs" :swagger-docs "/endpoints") 
       (swagger-docs "/endpoints" 
       {:info {:title "Hello World Api"}}) 

       (GET* "/greet" [] 
         :summary "Greets someone by name." 
         :description "Greets a person by name, telling them about 
            the database configuration we're using as well." 
         :return Greeting 
         :query-params [name :- s/Str] 
         (ok {:hello name :with-db db})) 

       (route/not-found (not-found {:error "Page not found."}))))) 

(defrecord Api 
    [port env db logger] 
    component/Lifecycle 

    (start [{:keys [connection] :as component}] 
    (if connection 
     component 
     (do (log/info "Starting Api at port" port "with env" env) 
      (let [application (app db) 
       handler (if (= env :dev) (wrap-reload application) application) 
       conn (http/start-server handler {:port port :join? false})] 
      (assoc component :connection conn))))) 

    (stop [{:keys [connection] :as component}] 
    (if-not connection 
     component 
     (do (log/info "Stopping Api") 
      (.close connection) 
      (assoc component :connection nil))))) 

(defn new-api [port env] 
    (->Api port env nil nil)) 

, я уже пытался отключить AOT компиляции, так что, как представляется, основное различие между обычной компиляции и построения uberjar, но без костей.Я также искал ключ «отсутствующего ключа» в исходном коде Схемы и убедился, что он указан правильно, это определенно кажется, поскольку, если я его смену, тесты Schema начнут сбой.

В чем отличие процесса компиляции при создании uberjar по сравнению с компиляцией в обычном режиме? Есть ли что-нибудь еще, что я могу попробовать?

ответ

3

Основная причина заключается в том, что для параметра swagger-docs -route задан недопустимый ввод (нет данных :version, см. https://github.com/metosin/ring-swagger/blob/master/src/ring/swagger/swagger2_schema.clj#L13). Когда он добавлен, он работает так, как ожидалось.

Тем не менее данное исключение было действительно плохим и теперь исправлено в последнем SNAPSHOT - использует значения по умолчанию для отсутствующих полей и, таким образом, не выполняет проверку схемы времени компиляции.

Кроме того, рекомендовал бы не AOTing всего приложения. См. https://github.com/metosin/compojure-api/issues/129

2

Я еще не видел эту ошибку (и мы развертываем все наши сервисы с помощью схемы и uberjar). Похоже, что строка 21 является промежуточным программным обеспечением swagger-docs; можете ли вы попробовать удалить это и посмотреть, устраняет ли это проблему?

+0

Спасибо за отзыв! Удаление линии 21/22 действительно решило проблему. Теперь мне нужно выяснить, почему чванство терпит неудачу ... Что заставило вас подозревать, что это проблема? – CalumMcCall

+1

@CalumMcCall номер строки в сообщении об ошибке. –

1

Я отреагировал на то, что вы используете :refer :all, предпочтительно использовать :refer [list of symbols used in code]. Это, вероятно, не ошибка здесь, но это делает код намного легче погрузиться в тех, кто не так много знает о библиотеках.

Я посмотрел в compojure.api.sweet -namespace и я вижу, что Зак Tellmans Potemkin используется для «импортных» всех функций из различных пространств имен в пространство имен service.api. Возможно, это создает проблемы при создании банки.

Не могли бы вы потребовать от swagger-ui и swagger-docs от их исходного пространства имен, добавив эту строку в запрос?

[compojure.api.swagger swagger-ui swagger-docs]

Если это не работает, но, по крайней мере, дает еще одно сообщение об ошибке (возможно) попытаться require все другие символы, используемые в явном виде.

+0

Чем больше я смотрю на compojure.api, тем меньше я понимаю, как он оценивает таблицу маршрутов, и отладка должна быть кошмаром. Я бы рекомендовал использовать другую, более явную библиотеку, чтобы облегчить Swagger. – claj

+0

Спасибо за подробный ответ. Я пробовал ваши предложения, явно ссылаясь на все, но у меня все равно появляется одно и то же сообщение об ошибке. Таким образом, проблема здесь, вероятно, что-то вроде конфликтов пространства имен между разными библиотеками, которые я использую? – CalumMcCall

+0

Я думаю, что есть несколько конфликтов в двух вложенных макросах. Может быть, 'macroexpand' и посмотреть, компилируются ли полученные выражения ... – claj

0

Я не уверен, что это поможет, но попробуйте запустить lein deps :tree и посмотреть, что такое транзитивные зависимости. Возможно, что несколько библиотек зависят от разных, несовместимых версий одной и той же зависимости. Раньше я сталкивался с этим, но я понятия не имею, почему это произойдет только при упаковке в uberjar.

Смежные вопросы