Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为luminus clojure项目创建可执行文件时出现问题_Clojure_Uberjar_Luminus - Fatal编程技术网

为luminus clojure项目创建可执行文件时出现问题

为luminus clojure项目创建可执行文件时出现问题,clojure,uberjar,luminus,Clojure,Uberjar,Luminus,我正在构建一个服务器程序,为包含照片细节的mongo数据库提供API。从REPL运行它,或者如果我使用leinrun启动它,所有这些都可以很好地工作 当我尝试运行uberjar时,问题就出现了。构建uberjar可以正常工作: (master) photo-api: lein uberjar Compiling photo-api.env Compiling photo-api.config Compiling photo-api.core WARNING: find-keyword alrea

我正在构建一个服务器程序,为包含照片细节的mongo数据库提供API。从REPL运行它,或者如果我使用leinrun启动它,所有这些都可以很好地工作

当我尝试运行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:
但是运行jar会产生一个错误:

(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

我认为您只是缺少必需的配置—至少是Mongo连接字符串

在开发模式下运行时,luminus(和cprops配置库)使用profiles.clj中的配置。 然而,这是leiningen的东西,从uberjar运行时不可用

您可以在“config.edn”文件中指定所有“生产”配置,并按如下方式运行uberjar:

java -Dconf=config.edn -jar target/uberjar/photo-api.jar
还可以使用java系统属性逐个设置配置值。
有关更多详细信息,请参阅。

由com.mongodb.ConnectionString.(ConnectionString.java:222)上的java.lang.NullPointerException引起。
ConnectionString
是您的文件吗?如果不是,您是否在该文件中传递了一些内容a
nil
?我还看到了很多对
mount.core$up$
的引用。这是你的功能吗?我不认识ConnectionString和grep-r ConnectionString。给出:二进制文件。/target/uberjar/photo-api.jar匹配项。我想这一定是mongo的一部分。mount.core$up$听起来像是luminus样板文件中用来启动服务器的东西。(mount/start)从repl启动服务器是启动服务器的一种方式,但这不是我写的东西。看起来问题在于您的程序无法与mongo建立连接。如何传递连接参数?从堆栈跟踪来看,问题似乎出在photo_api.db.core$fn_12620的
附近。photo_api.db.core$fn_12620.invokeStatic(core.clj:29)的invokeStatic(core.clj:29)invoke(core.clj:28)
无疑是朝着正确方向迈出的一步。如果我使用-Ddatabase url=“mongodb:127.0.0.1/photos”运行jar,那么它将正常启动,没有错误。但是仍然没有从数据库中得到任何信息,我只是得到了一个MongoTimeoutException。lein生成的文件.lein env只包含一行指定数据库url,没有其他内容。此外,mongo db工作正常。我可以用其他方法来达到这个目的。在my dev和prod版本中,该服务的端口号不同。改变它,修复它,现在一切正常。
(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 {}})
java -Dconf=config.edn -jar target/uberjar/photo-api.jar