Невозможно собрать автономную банку с помощью загрузки - PullRequest
3 голосов
/ 29 марта 2019

РЕДАКТИРОВАТЬ: Добавлено больше информации в конце.Кроме того, началась война с помощью jetty-runner.jar (но не с tomcat)

Я использую boot в качестве инструмента сборки для моего приложения clojure.

Это первое приложение, которое я написал с кодом cljs, cljc и clj (вместе с sass) в одном проекте.

My build.boot имеетследующая задача task-options

(def db-opts (:db (clojure.edn/read-string (slurp "resources/config.edn"))))
(task-options!
 pom {:project 'gcr
      :version "0.1"}
 cljs    {:optimizations :simple}
 uber    {:as-jars true}
 war     {:file "gcr.war"}
 ragtime {:database (str "jdbc:"
                         (:dbtype db-opts) "://"
                         (:user db-opts) ":"
                         (:password db-opts) "@"
                         (:host db-opts) ":"
                         (:port db-opts) "/"
                         (:dbname db-opts))}
 test    {:include #"gcr.test"
          :junit-output-to "junit-out"})

my build определяется следующим образом:

(deftask build
  "Builds an uberjar of this project that can be run with java -jar"
  []
  (comp
   (aot :all true ;; :namespace #{'gcr.server}
        )
   (pom)
   (cljs :optimizations :simple)
   (sass)
   (uber)
   (jar :file "gcr.jar" :main 'gcr.server)
   (sift :include #{#"gcr.jar"})
   (target)))

Когда я запускаю boot build, проект строится нормально, без ошибок.

Но когда я запускаю java -jar target/gcr.jar

, я получаю следующее:

$ java -jar target/gcr.jar
Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=lcd -Dswing.aatext=true
Exception in thread "main" java.lang.NoClassDefFoundError: clojure/lang/Var
        at gcr.server.<clinit>(Unknown Source)
Caused by: java.lang.ClassNotFoundException: clojure.lang.Var
        at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 1 more

Я смотрю на это около 24 часов и все еще не могу понять, как получитьэто работает.(Я наконец смог построить войну, которая работает с jetty-runner, но не с tomcat)

----------

Дополнительная информация:

My boot.properties равно

BOOT_CLOJURE_NAME=org.clojure/clojure
BOOT_CLOJURE_VERSION=1.10.0
BOOT_VERSION=2.8.2

, и я использую openjdk version "1.8.0_202"

Я проверил, имеет ли созданный файл JAR файл clojure, используя jar tf target/gcr.jar, и отображается следующая строка:

7c506484bc48541ffa5dcb4d9366a8a2-clojure-1.10.0.jar

Мой IFDE работает нормально, у меня есть следующая задача dev, определенная следующим образом:

(deftask dev
  "Launch Immediate Feedback Development Environment"
  []
  (comp
   (serve :handler 'gcr.core/app   ;; ring handler
          :resource-root "public"  ;; root classpath
          :reload true)            ;; reload ns
   (watch)
   (reload)
   (cljs-repl) ;; before cljs task
   (cljs)
   (sass)
   (target :dir #{"public"})))

set-env! часть выглядит следующим образом:

(set-env!
 :source-paths #{"src/scss" "src/clj" "src/cljs" "src/cljc"}
 :resource-paths #{"html" "resources"}

 :dependencies '[[org.clojure/clojure "1.10.0"]
                 [org.clojure/clojurescript "1.10.520"]
                 ;; server
                 [compojure "1.6.1"]
                 [ring/ring-core "1.7.1"]
                 [ring/ring-jetty-adapter "1.7.1"]
                 [ring/ring-json "0.4.0"]
                 [ring-middleware-format "0.7.4"]
                 ;; [javax.servlet/servlet-api "2.5" :scope "test"]
                 ;; [yogthos/config "1.1.1"]
                 ;; java 10 upgrade
                 [javax.xml.bind/jaxb-api "2.4.0-b180830.0359"]
                 ;; common
                 [org.clojure/core.async "0.4.490"]
                 [org.clojars.akiel/async-error "0.3"]
                 [hickory "0.7.1"]
                 [instaparse "1.4.10"]
                 ;; clj
                 [clj-time "0.15.1"]
                 [clj-http "3.9.1"]
                 [clout "2.2.1"]
                 [org.clojure/data.json "0.2.6"]
                 [org.clojure/data.codec "0.1.1"] ;; Base64
                 ;; cljs
                 [com.andrewmcveigh/cljs-time "0.5.2"]
                 [prismatic/dommy "1.1.0"]
                 [hipo "0.5.2"]
                 [hodgepodge "0.1.3"]
                 [cljs-http "0.1.46"]
                 [com.cemerick/url "0.1.1"]
                 [reagent "0.8.1"]
                 ;; db
                 [ragtime "0.8.0"]     ;; Migrations
                 [hikari-cp "2.7.1"]   ;; Connection Pooling
                 [org.clojure/java.jdbc "0.7.9"]
                 [honeysql "0.9.4"]
                 [org.postgresql/postgresql "42.2.5"]
                 ;; Authentication framework with JWT
                 [buddy/buddy-auth "2.1.0"]
                 [buddy/buddy-core "1.5.0"]
                 [buddy/buddy-sign "3.0.0"]
                 ;; argon2 for password hashing
                 [de.mkammerer/argon2-jvm "2.5"]
                 ;; logging
                 [com.taoensso/timbre "4.10.0"] ;; logging
                 [com.fzakaria/slf4j-timbre "0.3.12"]
                 [org.slf4j/log4j-over-slf4j "1.7.26"]
                 [org.slf4j/jul-to-slf4j "1.7.26"]
                 [org.slf4j/jcl-over-slf4j "1.7.26"]
                 ;; spec , test & gen
                 [org.clojure/test.check "0.9.0"]
                 ;; Dependencies for build process
                 [adzerk/boot-cljs "2.1.5"]
                 [adzerk/boot-test "1.2.0" :scope "test"]
                 [pandeiro/boot-http "0.8.3"]
                 [adzerk/boot-reload "0.6.0"]
                 [adzerk/boot-cljs-repl "0.4.0"]
                 [cider/piggieback "0.3.9" :scope "test"]
                 [nrepl "0.4.5" :scope "test"]
                 ;; [com.cemerick/piggieback "0.2.2" :scope "test"]
                 [weasel "0.7.0" :scope "test"]
                 [org.clojure/tools.nrepl "0.2.13" :scope "test"]
                 [mbuczko/boot-ragtime "0.3.1"]
                 [deraen/boot-sass "0.3.1"]
                 [tolitius/boot-check "0.1.12"]])

После долгих тренировок с заданиями я смог создать файл войны, который работает с jetty-runner, со следующей задачей:

(deftask build-war
  "Build the target/app.war file"
  []
  (comp
   (aot :all true)
   (web :serve 'gcr.core/app)
   (cljs :optimizations :advanced)
   (sass)
   (sift :move {#"(.*)js$" "public/$1js"
                #"(.*)html$" "public/$1html"
                #"css/(.*)" "public/css/$1"})
   (uber)
   (war :file "gcr.war")
   (sift :include [#"gcr.war"])
   (target)))

Использование задачи sift для перемещения статическогоресурсы для папки public были ключевыми, так как мои ресурсы compojure были определены в моем routes.clj (не включая API и другие маршруты).

(defroutes gen-routes 
  (GET "/login" [] auth/auth-handler)
  (files "/" {:root "public"})          ;; to serve static resources
  (resources "/" {:root "public"})      ;; to serve anything else
  (not-found "404 Page Not Found"))     ;; page not found

Это, однако, все еще не производит war файл, который работает на tomcat.То есть при развертывании в tomcat все маршруты API работают должным образом, но статические html-файлы отображаются как HTTP / 404.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...