2015-08-26 3 views
5

Я использую lein uberjar для создания автономной банки приложения.Clojure Uberjar не загружает файл ресурсов

При выполнении

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

он падает с:

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

загружаю файл через:

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

ресурсы/configuration.json помещается в корневую папку баночке

ответ

10

clojure.java.io/resource возвращает URL, а не файл. Вот почему вы можете позвонить slurp. Сообщение об ошибке сообщает вам, что это не файл, к сожалению, он не говорит вам, что это URL-адрес.

Конечно, вы могли бы открыть URL-адрес с java.net.URL api, хотя в этом случае это было бы излишним.

+0

После этого я вызываю slurp. Проблема в том, что файл не найден. При разработке он работает. –

+0

Нет, ошибка говорит: «Не файл». Он не говорит «Файл не найден». Смотрите это: https://clojuredocs.org/clojure.java.io/resource –

+1

Вы были правы. Я должен был прорваться прямо на ресурс. –

4

Если вы хотите прочитать содержимое файла configuration.json, не называйте io/file. Вместо этого используйте slurp функцию, как и что:

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

После этого я вызываю slurp. Проблема в том, что файл не найден. При разработке он работает. –

Смежные вопросы