为luminus clojure项目创建可执行文件时出现问题
我正在构建一个服务器程序,为包含照片细节的mongo数据库提供API。从REPL运行它,或者如果我使用leinrun启动它,所有这些都可以很好地工作 当我尝试运行uberjar时,问题就出现了。构建uberjar可以正常工作:为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
(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
是您的文件吗?如果不是,您是否在该文件中传递了一些内容anil
?我还看到了很多对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