这不是直接回答 OP 的问题,而是skuro mentioned something 在他的最后一段中非常有用,即在开发期间使资源在类路径上可用,但不将它们包含在发布 jar/uberjar 中。
这样做的原因是,您可以将资源单独放在 jar 之外 - 例如将配置文件放在 /etc 下 - 然后在运行时通过在类路径中列出此类资源文件夹来链接到它们。
project.clj 中的定义
- 从您的 project.clj 中删除顶级
:resource-paths;
- 在顶层的 project.clj 中添加以下行:
:profiles {:dev {:resource-paths ["src/main/resources"]}}
这样,资源将在开发期间(编译、测试、复制)在类路径上可用,但不会包含在发布 jar 中。
作为一种选择,您可能希望将一些资源与发布 jar 捆绑在一起,例如应用程序图标和图形,而不是其他资源,例如配置文件。在这种情况下,您可以将资源文件夹拆分为子目录并声明您想要包含在顶层的那些,而其余的则在 dev 配置文件下:
:resource-paths ["src/main/resources/icons"
"src/main/resources/images"]
:profiles {:dev {:resource-paths ["src/main/resources/config"]}}
在代码中引用资源
使用上述方法,您可以通过在类路径(如Kevin 和Valerii 所示)而不是直接在文件系统上查看资源,在开发和生产期间统一引用资源:
(require '[clojure.java.io :as jio])
(jio/file (jio/resource "relative/path/to/resource.xml"))
运行时类路径
在开发期间,Leiningen 将在类路径中包含顶级资源和 dev 配置文件资源。对于发布的运行时,您必须自己为 JRE 配置类路径:
java -cp "/etc/myapp:/usr/local/lib/myapp.jar" myapp.core $*
此外,您实际上也可以将所有资源保留在 jar 中。这样,包含的资源将用作默认值。如果您设置类路径以使 .jar 文件位于配置文件夹之后(示例中为 /etc/myapp),则配置文件夹下具有相同相对资源路径的资源文件将优先于 jar 中包含的资源文件.