Clojure Uberjar未加载资源文件

Clojure Uberjar未加载资源文件,jar,clojure,resources,leiningen,uberjar,Jar,Clojure,Resources,Leiningen,Uberjar,我使用leinuberjar创建应用程序的独立jar 执行时 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.co

我使用leinuberjar创建应用程序的独立jar

执行时

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

resources/configuration.json放在jar的根文件夹中

如果要读取
configuration.json
文件的内容,请不要调用
io/file
。相反,请使用
slurp
函数,如下所示:

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

clojure.java.io/resource
返回URL,而不是文件。这就是为什么你可以在上面调用
slurp
。错误消息告诉您它不是一个文件,不幸的是它没有告诉您它是一个URL


当然,您可以使用java.net.url api打开url,不过在这种情况下,这样做太过分了。

之后我会调用文件上的slurp。问题是找不到该文件。开发时,它是有效的。不,错误是“不是文件”。它不是说“找不到文件”。请看:您是对的。我不得不直接在资源上咕噜咕噜地说,然后我就调用文件上的咕噜咕噜。问题是找不到该文件。开发时,它可以工作。我可以在开发后写入此配置文件吗?