2017-09-19 44 views
2

我正在構建一個服務器程序,以提供一個包含照片細節的mongo數據庫的API。所有的作品都可以很好地從REPL中運行,或者如果我使用lein run啓動它。創建可執行的問題爲luminus clojure項目

當我嘗試運行uberjar時會出現問題。構建uberjar工程確定:

(master) photo-api: lein uberjar 
Compiling photo-api.env 
Compiling photo-api.config 
Compiling photo-api.core 
WARNING: find-keyword already refers to: #'clojure.core/find-keyword in  namespace: image-lib.core, being replaced by: #'image-lib.core/find-keyword 
Compiling photo-api.db.core 
Compiling photo-api.handler 
Compiling photo-api.layout 
Compiling photo-api.middleware 
Compiling photo-api.routes.home 
Compiling photo-api.routes.services 
Created /Users/iain/Code/Clojure/Luminus/photo-api/target/uberjar/photo-api-0.1.0-SNAPSHOT.jar 
Created /Users/iain/Code/Clojure/Luminus/photo-api/target/uberjar/photo-api.jar 
(master) photo-api: 

但在運行罐子給出了一個錯誤:

(master) photo-api: java -jar target/uberjar/photo-api.jar 
WARNING: find-keyword already refers to: #'clojure.core/find-keyword in namespace: image-lib.core, being replaced by: #'image-lib.core/find-keyword 
read config from resource: "config.edn" 
Exception in thread "main" java.lang.RuntimeException: could not start [#'photo-api.db.core/db*] due to 
    at mount.core$up$fn__420.invoke(core.cljc:92) 
    at mount.core$up.invokeStatic(core.cljc:92) 
    at mount.core$up.invoke(core.cljc:90) 
    at mount.core$bring.invokeStatic(core.cljc:210) 
    at mount.core$bring.invoke(core.cljc:202) 
    at mount.core$start.invokeStatic(core.cljc:252) 
    at mount.core$start.doInvoke(core.cljc:244) 
    at clojure.lang.RestFn.invoke(RestFn.java:397) 
    at mount.core$start_with_args.invokeStatic(core.cljc:350) 
    at mount.core$start_with_args.doInvoke(core.cljc:346) 
    at clojure.lang.RestFn.invoke(RestFn.java:410) 
    at photo_api.core$start_app.invokeStatic(core.clj:42) 
    at photo_api.core$start_app.invoke(core.clj:41) 
    at photo_api.core$_main.invokeStatic(core.clj:50) 
    at photo_api.core$_main.doInvoke(core.clj:49) 
    at clojure.lang.RestFn.invoke(RestFn.java:397) 
    at clojure.lang.AFn.applyToHelper(AFn.java:152) 
    at clojure.lang.RestFn.applyTo(RestFn.java:132) 
    at photo_api.core.main(Unknown Source) 
Caused by: java.lang.NullPointerException 
    at com.mongodb.ConnectionString.<init>(ConnectionString.java:222) 
    at com.mongodb.MongoClientURI.<init>(MongoClientURI.java:189) 
    at com.mongodb.MongoClientURI.<init>(MongoClientURI.java:171) 
    at monger.core$connect_via_uri.invokeStatic(core.clj:230) 
    at monger.core$connect_via_uri.invoke(core.clj:230) 
    at photo_api.db.core$fn__12620.invokeStatic(core.clj:29) 
    at photo_api.db.core$fn__12620.invoke(core.clj:28) 
    at mount.core$record_BANG_.invokeStatic(core.cljc:86) 
    at mount.core$record_BANG_.invoke(core.cljc:85) 
    at mount.core$up$fn__420.invoke(core.cljc:93) 
    ... 18 more 

或者快照罐子。

(master) photo-api: java -jar target/uberjar/photo-api-0.1.0-SNAPSHOT.jar 

Exception in thread "main" java.lang.NoClassDefFoundError: clojure/lang/Var 
    at photo_api.core.<clinit>(Unknown Source) 
Caused by: java.lang.ClassNotFoundException: clojure.lang.Var 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 1 more 
(master) photo-api: 

我在這裏錯過了什麼?我猜這是關於開發構建和生產構建差異的問題,但是我不能發現任何明顯的東西,並且錯誤消息對我來說幫助不大。

這是項目文件,據我記得主要是從原來的Luminus公司模板直:

(defproject photo-api "0.1.0-SNAPSHOT" 

    :description "API for geting data from photos db" 
    :url "http://soulflyer.com" 

    :dependencies [[cider/cider-nrepl "0.14.0"] 
      [clj-time "0.13.0"] 
      [com.google.guava/guava "20.0"] 
      [com.novemberain/monger "3.1.0" :exclusions [com.google.guava/guava]] 
      [compojure "1.6.0"] 
      [cprop "0.1.10"] 
      [funcool/struct "1.0.0"] 
      [luminus-immutant "0.2.3"] 
      [luminus-nrepl "0.1.4"] 
      [luminus/ring-ttl-session "0.3.2"] 
      [markdown-clj "0.9.99"] 
      [metosin/compojure-api "1.1.10"] 
      [metosin/muuntaja "0.3.1"] 
      [metosin/ring-http-response "0.9.0"] 
      [mount "0.1.11"] 
      [org.clojure/clojure "1.8.0"] 
      [org.clojure/tools.cli "0.3.5"] 
      [org.clojure/tools.logging "0.4.0"] 
      [org.clojure/data.json "0.2.6"] 
      [org.webjars.bower/tether "1.4.0"] 
      [org.webjars/bootstrap "4.0.0-alpha.5"] 
      [org.webjars/font-awesome "4.7.0"] 
      [org.webjars/jquery "3.1.1"] 
      [ring-webjars "0.2.0"] 
      [ring/ring-core "1.6.1"] 
      [ring/ring-defaults "0.3.0"] 
      [selmer "1.10.7"] 
      [image-lib "0.2.1-SNAPSHOT"]] 

    :min-lein-version "2.0.0" 

    :jvm-opts ["-server" "-Dconf=.lein-env"] 
    :source-paths ["src/clj"] 
    :test-paths ["test/clj"] 
    :resource-paths ["resources"] 
    :target-path "target/%s/" 
    :main ^:skip-aot photo-api.core 

    :plugins [[lein-cprop "1.0.3"] 
     [org.clojars.punkisdead/lein-cucumber "1.0.5"] 
     [lein-immutant "2.1.0"]] 
    :cucumber-feature-paths ["test/clj/features"] 


    :profiles 
    {:uberjar {:omit-source true 
     :aot :all 
     :uberjar-name "photo-api.jar" 
     :source-paths ["env/prod/clj"] 
     :resource-paths ["env/prod/resources"]} 

    :dev   [:project/dev :profiles/dev] 
    :test   [:project/dev :project/test :profiles/test] 

    :project/dev {:dependencies [[prone "1.1.4"] 
          [ring/ring-mock "0.3.0"] 
          [ring/ring-devel "1.6.1"] 
          [pjstadig/humane-test-output "0.8.2"] 
          [clj-webdriver/clj-webdriver "0.7.2"] 
          [org.apache.httpcomponents/httpcore "4.4"] 
          [org.clojure/core.cache "0.6.3"] 
          [org.seleniumhq.selenium/selenium-server "2.48.2"]] 
       :plugins  [[com.jakemccrary/lein-test-refresh "0.19.0"] 
          [refactor-nrepl "2.3.0-SNAPSHOT"]] 
       :source-paths ["env/dev/clj"] 
       :resource-paths ["env/dev/resources"] 
       :repl-options {:init-ns user} 
       :injections [(require 'pjstadig.humane-test-output) 
          (pjstadig.humane-test-output/activate!)]} 
    :project/test {:resource-paths ["env/test/resources"]} 
    :profiles/dev {} 
    :profiles/test {}}) 
+0

'由com.mongodb.ConnectionString引發的java.lang.NullPointerException。 (ConnectionString.java:222)'。 'ConnectionString'是你的文件嗎?如果不是,你是否在該文件中傳遞了一個'nil'? – Carcigenicate

+0

我也看到很多'mount.core $ up $'的引用。這是你的功能嗎? – Carcigenicate

+0

我無法識別ConnectionString和grep -r ConnectionString。給出: 二進制文件./target/uberjar/photo-api.jar匹配。我認爲它一定是mongo的一部分。 mount.core $ up $聽起來像是luminus樣板文件啓動服務器的東西。 (mount/start)是啓動服務器的方法之一,但它不是我寫的。 – Iain

回答

1

我認爲你只是缺少必需的配置 - 至少蒙戈連接字符串。

在開發模式下運行時,luminus(和cprops配置庫)使用profiles.clj中的配置。 但是,這是leiningen的事情,它從uberjar運行時不可用。

您可以在「config.edn」文件中指定所有的「生產」配置並運行uberjar這樣的:

java -Dconf=config.edn -jar target/uberjar/photo-api.jar 

您還可以使用Java系統屬性來設置配置值一個接一個。 有關更多詳細信息,請參閱http://www.luminusweb.net/docs/environment.md

+0

絕對是朝着正確方向邁出的一步。如果我使用-Ddatabase-url =「mongodb:127.0.0.1/photos」運行jar,那麼它就會正常啓動並且沒有錯誤。仍然沒有從數據庫獲得任何信息,但我只是得到一個MongoTimeoutException。 lein生成的文件.lein-env只包含一行,用於指定數據庫url,沒有別的。此外,mongo數據庫工作正常。我可以用其他方法來解決這個問題。 – Iain

+0

啊。在我的dev和prod版本中,服務的端口號是不同的。改變它解決了它,現在所有的作品。 – Iain