根据 Ankur 的评论,我设法拼凑出我需要的功能:
java.util.jar.JarFile
对象完成工作。
您可以调用该方法(.entries (Jarfile. a-path))
来提供文件列表,而不是返回树结构:
IE:
/目录-1
/文件-1
/文件-2
/目录-2
/文件-3
/目录-3
/文件-4
它返回文件名的枚举:
/dir-1/file-1, /dir-1/file-2, /dir-1/dir-2/file-3, /dir-1/dir-3/file-4
我需要的以下功能定义如下:
(导入 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 内部目录 "/")
内部目录)
条目(枚举序列(.entries jar))
名称(map (fn [x] (.getName x)) 条目)
snames (过滤器 (fn [x] (= 0 (.indexOf x inner-dir))) 名称)
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 条目)))))
用法:
(从 jar 中读取“/Users/Chris/.m2/repository/lein-newnew/lein-newnew/0.3.5/lein-newnew-0.3.5.jar”
“莱宁根/new.clj”)
;=> "内置模板列表可以用`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 .....)