Ankurのコメントから、私は必要な機能をまとめることができました。
java.util.jar.JarFile
オブジェクトがその役割を果たします。
メソッド(.entries (Jarfile. a-path))
を呼び出してファイルのリストを提供できますが、ツリー構造を返す代わりに、次のようにします。
すなわち:
/ dir-1
/ file-1
/ file-2
/ dir-2
/ file-3
/ dir-3
/ file-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 inner-dir "/")
内側の方向)
エントリ(enumeration-seq(.entries jar))
名前(マップ(fn [x](.getName x))エントリ)
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")
; => "組み込みテンプレートのリストは、` lein helpnew`.....で表示できます。 "
(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 .....)