2015-08-26 16 views
5

Ich benutze Lein Uberjar, um ein eigenständiges Glas einer Anwendung zu erstellen.Clojure Uberjar nicht laden Ressource-Datei

Bei der Ausführung

java -jar dataloader-0.1.0-SNAPSHOT-standalone.jar, 

stürzt mit:

Caused by: java.lang.IllegalArgumentException: Not a file: 
jar:file:dataloader-0.1.0-SNAPSHOT-standalone.jar!/configuration.json 

lade ich die Datei über:

(ns dataloader.configuration 
    (:gen-class) 
    (:require [cheshire.core :refer :all] 
      [clojure.java.io :as io])) 

(def data-file 
    (io/file 
    (io/resource "configuration.json"))) 

project.clj

(defproject dataloader "0.1.0-SNAPSHOT" 
    :description "Used for loading stage data into local vagrantbox" 
    :url "http://example.com/FIXME" 
    :license {:name "Eclipse Public License" 
      :url "http://www.eclipse.org/legal/epl-v10.html"} 
    :resource-paths ["resources"] 
    :dependencies [[org.clojure/clojure "1.6.0"] 
       [clojurewerkz/elastisch "2.1.0"] 
       [org.clojure/java.jdbc "0.3.7"] 
       [mysql/mysql-connector-java "5.1.32"] 
       [clj-http "2.0.0"] 
       [org.clojure/data.json "0.2.6"] 
       [org.clojure/data.codec "0.1.0"] 
       [cheshire "5.5.0"]] 

    :main ^:skip-aot dataloader.core 
    :target-path "target/%s" 
    :profiles {:uberjar {:aot :all}}) 

resources/configuration.json wird in den Stammordner des Glases setzen

Antwort

10

clojure.java.io/resource gibt eine URL, keine Datei. Deshalb können Sie slurp darauf anrufen. Die Fehlermeldung weist darauf hin, dass es sich nicht um eine Datei handelt. Leider sagt sie Ihnen nicht, dass es sich um eine URL handelt.

Natürlich könnten Sie die URL mit der java.net.URL API öffnen, obwohl das in diesem Fall übertrieben wäre.

+0

Ich rufe danach die Datei an. Das Problem ist, dass die Datei nicht gefunden wird. Bei der Entwicklung funktioniert es. –

+0

Nein, der Fehler lautet "Keine Datei". Es heißt nicht "Datei nicht gefunden". Sehen Sie dies: https://clojuredocs.org/clojure.java.io/resource –

+1

Sie hatten Recht. Ich musste direkt auf die Ressource schlürfen. –

4

Wenn Sie den Inhalt der configuration.json Datei lesen möchten, dann io/file nicht nennen. Verwenden Sie stattdessen slurp Funktion, wie folgt aus:

(def config (slurp (io/resource "configuration.json"))) 
+0

Ich rufe danach die Datei an. Das Problem ist, dass die Datei nicht gefunden wird. Bei der Entwicklung funktioniert es. –