如何使用clojure.java.io从特定的.jar文件加载资源
在如何使用clojure.java.io从特定的.jar文件加载资源,clojure,Clojure,在clojure.java.io中,有一个io/resource函数,但我认为它只是加载当前正在运行的jar的资源。有没有办法指定资源所在的.jar文件 例如: 我有一个jar文件:/path/to/abc.jar abc.jar解压时在解压目录的根目录中包含some/text/output.txt output.txt包含字符串“我想要的所需文本。” 我需要能够执行这些操作的函数: (list-jar "/path/to/abc.jar" "some/text/") ;; => "o
clojure.java.io
中,有一个io/resource
函数,但我认为它只是加载当前正在运行的jar的资源。有没有办法指定资源所在的.jar
文件
例如:
- 我有一个jar文件:
/path/to/abc.jar
解压时在解压目录的根目录中包含abc.jar
some/text/output.txt
包含字符串output.txt
“我想要的所需文本。”
(list-jar "/path/to/abc.jar" "some/text/")
;; => "output.txt"
(read-from-jar "/path/to/abc.jar" "some/text/output.txt")
;; => "The required text that I want"
提前谢谢 根据Ankur的评论,我成功地拼凑出了我需要的功能:
java.util.jar.JarFile
对象执行此任务
您可以调用方法(.entries(Jarfile.a-path))
给出文件列表,但不返回树结构:
i、 e:
用法:
(从jar/Users/Chris/.m2/repository/leinnewnew/leinnewnew/0.3.5/lein-newnew-0.3.5.jar中读取)
“leiningen/new.clj”)
;=> “内置模板的列表可以通过'lein help new'
(列出jar“/Users/Chris/.m2/repository/leinnewnew/leinnewnew/0.3.5/lein-newnew-0.3.5.jar”“leiningen”)
;; => (新建/app/core.clj新建/app/project.clj…)
Jar文件只是一个zip文件,因此基本上可以使用clojure/java的任何zip库来实现这一点。我知道这个东西存在,但我记不起它的名称。 /dir-1 /file-1 /file-2 /dir-2 /file-3 /dir-3 /file-4 (import java.util.jar.JarFile) (defn list-jar [jar-path inner-dir] (if-let [jar (JarFile. jar-path)] (let [inner-dir (if (and (not= "" inner-dir) (not= "/" (last inner-dir))) (str inner-dir "/") inner-dir) entries (enumeration-seq (.entries jar)) names (map (fn [x] (.getName x)) entries) snames (filter (fn [x] (= 0 (.indexOf x inner-dir))) names) fsnames (map #(subs % (count inner-dir)) snames)] fsnames))) (defn read-from-jar [jar-path inner-path] (if-let [jar (JarFile. jar-path)] (if-let [entry (.getJarEntry jar inner-path)] (slurp (.getInputStream jar entry))))) (read-from-jar "/Users/Chris/.m2/repository/lein-newnew/lein-newnew/0.3.5/lein-newnew-0.3.5.jar" "leiningen/new.clj") ;=> "The list of built-in templates can be shown with `lein help new`....." (list-jar "/Users/Chris/.m2/repository/lein-newnew/lein-newnew/0.3.5/lein-newnew-0.3.5.jar" "leiningen") ;; => (new/app/core.clj new/app/project.clj .....)