Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用clojure.java.io从特定的.jar文件加载资源_Clojure - Fatal编程技术网

如何使用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 .....)