1

clojure.java.ioio/resource関数がありますが、実行中の現在のjarのリソースをロードするだけだと思います。.jarリソースが含まれているファイルを指定する方法はありますか?

例えば:

  • 私はjarファイルを持っています:/path/to/abc.jar
  • abc.jarsome/text/output.txt解凍されたディレクトリのルートに含まれている場合
  • output.txt文字列が含まれています"The required text that I want."

これらの操作を実行できる関数が必要です。

(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"

前もって感謝します!

4

1 に答える 1

2

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

于 2012-10-17T05:28:04.120 に答える