【发布时间】:2014-03-12 20:25:16
【问题描述】:
我正在使用 leiningen 和 Clojure 创建一个 uberjar,因此我有一个用于部署的文件。我还使用 leiningen 的默认资源路径嵌入了一些静态文件,其名称和数量因构建而异。有没有一种惯用的方法可以从 Clojure 获取嵌入式资源列表?我知道我可以使用clojure.java.io/resource 访问一个已知的文件名,但是我怎样才能得到一个文件列表呢?
【问题讨论】:
我正在使用 leiningen 和 Clojure 创建一个 uberjar,因此我有一个用于部署的文件。我还使用 leiningen 的默认资源路径嵌入了一些静态文件,其名称和数量因构建而异。有没有一种惯用的方法可以从 Clojure 获取嵌入式资源列表?我知道我可以使用clojure.java.io/resource 访问一个已知的文件名,但是我怎样才能得到一个文件列表呢?
【问题讨论】:
以下list-resources 函数返回path 中的jar 中所有文件的列表。 running-jar 保存当前运行的 jar 的路径,如果它实际上是一个 jar。
(def ^:private running-jar
"Resolves the path to the current running jar file."
(-> :keyword class (.. getProtectionDomain getCodeSource getLocation getPath)))
(defn list-resources [path]
(let [jar (java.util.jar.JarFile. path)
entries (.entries jar)]
(loop [result []]
(if (.hasMoreElements entries)
(recur (conj result (.. entries nextElement getName)))
result))))
(take 10 (list-resources running-jar))
【讨论】: