2017-09-19 3 views
2

Je suis en train de créer un programme serveur pour fournir une API à une base de données mongo contenant des détails de photos. Tout fonctionne bien à partir du REPL, ou si je le lance en utilisant lein run.Problèmes de création d'un exécutable pour un projet clojure luminus

Les problèmes se produisent lorsque j'essaie d'exécuter l'uberjar. Construire le uberjar fonctionne bien:

(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: 

mais l'exécution du pot donne une erreur:

(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 

Ou le pot SNAPSHOT.

(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: 

Que manque-t-il ici? Je suppose que c'est quelque chose à voir avec les différences de build et de build de dev, mais je ne peux rien voir d'évident et les messages d'erreur ne m'aident pas beaucoup.

Ceci est le fichier de projet pour autant que je me souviens est la plupart du temps directement à partir du modèle de Luminus d'origine:

(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

'Provoqué par: java.lang.NullPointerException sur com.mongodb.ConnectionString. (ConnectionString.java:222) '. Est-ce que 'ConnectionString' est votre fichier? Si ce n'est pas le cas, passez-vous quelque chose dans ce fichier? – Carcigenicate

+0

Je vois aussi beaucoup de références à 'mount.core $ up $'. Est-ce votre fonction? – Carcigenicate

+0

Je ne reconnais pas ConnectionString et grep -r ConnectionString. donne: Fichier binaire ./target/uberjar/photo-api.jar correspond à. Je pense que ça doit faire partie de mongo. mount.core $ up $ sonne comme quelque chose de la plaque d'éclairage du luminus pour démarrer le serveur. (mount/start) du repl est l'une des façons de démarrer le serveur, mais ce n'est pas quelque chose que j'ai écrit. – Iain

Répondre

1

Je pense que vous êtes manquant configuration requise - au moins la chaîne de connexion Mongo. Lors de l'exécution en mode dev, la bibliothèque de configuration de luminus (et cprops) utilise la configuration de votre profiles.clj. Cependant, ceci est la chose leiningen et il n'est pas disponible lors de l'exécution de uberjar.

Vous pouvez spécifier toute votre configuration « de production » dans le fichier « config.edn » et exécuter uberjar comme ceci:

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

Vous pouvez également utiliser les propriétés du système Java pour définir la configuration des valeurs une par une. Voir http://www.luminusweb.net/docs/environment.md pour plus de détails.

+0

Certainement un pas dans la bonne direction. Si je lance le fichier avec -Ddatabase-url = "mongodb: 127.0.0.1/photos", alors il démarre correctement sans erreur. Cependant, je ne reçois toujours aucune information de la base de données, je viens d'obtenir une exception MongoTimeoutException. Le fichier généré lein .lein-env contient seulement une ligne spécifiant l'URL de la base de données, rien d'autre. Aussi le mongo db fonctionne bien. Je peux y arriver en utilisant d'autres méthodes. – Iain

+0

Ahh. Le numéro de port du service est différent dans mes versions dev et prod. Changer cela l'a arrangé, tout fonctionne maintenant. – Iain