gpt4 book ai didi

java - Clojure 列出 uberjar 资源中的子文件夹

转载 作者:行者123 更新时间:2023-11-29 04:25:39 25 4
gpt4 key购买 nike

我有这样的文件夹结构:

  • 资源
    • 一个
      • b
        • x.txt
      • c
        • x.txt

我已经使用 lein uberjar 创建了我的可运行 jar。

运行我的 jar 时,我想列出 a 的子文件夹。

我知道我可以使用 clojure.java.io 获取 resources/a/b/x.txt 的内容

(slurp (clojure.java.io/resource "a/b/x.txt"))

但我找不到列出子文件夹的简单方法。

(clojure.java.io/file (clojure.java.io/resource "a")) 只是导致 java.lang.IllegalArgumentException: Not a file 因为它不是文件,所以它是 jar 文件中的资源。

是否有库可以执行此操作?

最佳答案

这里是 java 特定答案的代码端口:

(ns my-project.core
(:require [clojure.string :as cs])
(:import java.util.zip.ZipInputStream)
(:gen-class))

(defrecord HELPER [])

(defn get-code-location []
(when-let [src (.getCodeSource (.getProtectionDomain HELPER))]
(.getLocation src)))

(defn list-zip-contents [zip-location]
(with-open [zip-stream (ZipInputStream. (.openStream zip-location))]
(loop [dirs []]
(if-let [entry (.getNextEntry zip-stream)]
(recur (conj dirs (.getName entry)))
dirs))))

(defn -main [& args]
(println (some->> (get-code-location)
list-zip-contents
(filter #(cs/starts-with? % "a/")))))

被放入主命名空间并使用 jar 运行将输出 /resources/a 文件夹中的所有路径..

java -jar ./target/my-project-0.1.0-SNAPSHOT-standalone.jar 
;;=> (a/ a/b/ a/b/222.txt a/222.txt)

还有一些快速研究让我找到了这个库: https://github.com/ronmamo/reflections

它缩短了代码,但也需要项目的一些依赖项(我想这可能是不受欢迎的):

[org.reflections/reflections "0.9.11"]
[javax.servlet/servlet-api "2.5"]
[com.google.guava/guava "23.0"]

代码是这样的:

(ns my-project.core
(:require [clojure.string :as cs])
(:import java.util.zip.ZipInputStream
[org.reflections
Reflections
scanners.ResourcesScanner
scanners.Scanner
util.ClasspathHelper
util.ConfigurationBuilder])
(:gen-class))

(defn -main [& args]
(let [conf (doto (ConfigurationBuilder.)
(.setScanners (into-array Scanner [(ResourcesScanner.)]))
(.setUrls (ClasspathHelper/forClassLoader (make-array ClassLoader 0))))]
(println
(filter #(cs/starts-with? % "a/")
(.getResources (Reflections. conf) #".*")))))

关于java - Clojure 列出 uberjar 资源中的子文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46488466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com