Я разрабатываю простое веб-приложение hello world на Clojure. Однако после того, как я добавил в свой проект библиотеку Schema, при попытке создать uberjar с использованием lein uberjar
. Как ни странно, приложение по-прежнему проходит модульные тесты и работает без ошибок при запуске с lein dev
.
Ниже приведен исходный файл, в котором я использую схему. Для краткости я опустил остальные исходные файлы, но если кто-то хочет увидеть остальные, просто спросите.
Я уже пробовал отключить компиляцию AOT, так как это, кажется, основное различие между обычной компиляцией и сборкой uberjar, но без кубиков. Я также искал ключ «missing-required-key» в исходном коде схемы и убедился, что он правильно процитирован, это определенно похоже, поскольку, если я его изменю, тесты схемы начинают давать сбой.
(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). Когда он добавлен, он работает как положено.