2015-08-26 44 views
5

Uso lein uberjar per creare un jar autonomo di un'applicazione.Clojure Uberjar che non carica il file di risorse

Quando si esegue

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

si blocca con:

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

si carica il file tramite:

(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}}) 

risorse/configuration.json è messo nella cartella principale del vaso

risposta

10

clojure.java.io/resource restituisce un URL, non un file. Ecco perché è possibile chiamare slurp su di esso. Il messaggio di errore ti dice che non è un file, sfortunatamente non ti sta dicendo che è un URL.

Ovviamente è possibile aprire l'URL con l'API java.net.URL anche se in questo caso sarebbe eccessivo.

+0

In seguito chiamo slurp sul file. Il problema è che il file non è stato trovato. Quando si sviluppa, funziona. –

+0

No, l'errore dice "Non è un file". Non dice "File non trovato". Vedi questo: https://clojuredocs.org/clojure.java.io/resource –

+1

Avevi ragione. Dovevo bere direttamente sulla risorsa. –

4

Se vuoi leggere il contenuto del file configuration.json, non chiamare io/file. Invece, utilizzare la funzione slurp, come quella:

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

In seguito chiamo slurp sul file. Il problema è che il file non è stato trovato. Quando si sviluppa, funziona. –