Разработвам просто уеб приложение hello world в Clojure. Въпреки това, след като добавих библиотеката Schema към моя проект, започнах да получавам грешката по-долу, когато се опитвах да създам uberjar с помощта на lein uberjar
. Странно, но приложението все още преминава тестовете на модула и работи без грешки, когато стартира с lein dev
.
По-долу е изходният файл, където използвам схема. За краткост съм пропуснал останалите си изходни файлове, но ако някой иска да види останалите, просто попитайте.
Вече се опитах да деактивирам AOT компилацията, тъй като това изглежда е основната разлика между нормалната компилация и изграждането на uberjar, но без зарове. Също така потърсих ключа „missing-required-key“ в изходния код на Schema и се уверих, че е цитиран правилно, определено изглежда така, тъй като ако го променя, тестовете на Schema започват да се провалят.
(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))
Какво друго е различно в процеса на компилиране при създаване на uberjar в сравнение с нормалното компилиране? Има ли нещо друго, което мога да опитам?
Основната причина е, че на lein uberjar
-маршрута е даден невалиден вход (не е даден lein dev
, вижте https://github.com/metosin/ring-swagger/blob/master/src/ring/swagger/swagger2_schema.clj#L13). Когато се добави, работи според очакванията.