我想要做的是在独立的Maven repo/clojar中打包一个大文件(一个MIDI soundfont),然后能够以编程方式将其拉下来并使用它一个单独的项目。这个看似简单的任务证明比我预期的更复杂。从外部的clojar导入/使用资源
如果有一种方法可以直接访问这些资源,或者将它们公开为公共变量或什么的,那么最理想的是什么。这是我想的第一件事 - 我做了这样的事情:
(ns midi.soundfont.fluid-r3
(:require [clojure.java.io :as io]))
(def sf2
(io/file (io/resource "fluid-r3.sf2")))
但是,我快到问题是io/resource
只能找到当前类路径中的资源文件。当我尝试需要从其他项目这个命名空间(或从REPL),我得到:
java.lang.IllegalArgumentException: Not a file: jar:file:/Users/dave/.m2/repository/midi/soundfont/fluid-r3/midi.soundfont.fluid-r3/0.1.0/midi.soundfont.fluid-r3-0.1.0.jar!/fluid-r3.sf2
如果它不能直接访问资源,我将很高兴与涉及复制的解决方案文件到文件系统中的某个路径。我也尝试过这种方法,但是当尝试从不同的项目运行“将文件复制到文件系统”方法时遇到了同样的问题 - io/resource
仍然找不到文件,因为它不在当前类路径中。
我发现,已经被问过SO以前类似的问题,如:
- Idiomatic Clojure to copy resources from running jar to outside
- How to copy file inside jar to outside the jar?
然而,这些解决方案似乎只涉及到复制文件,它是一个资源在当前(运行)项目。
是否有可能做这两件事之一?
- 从外部clojar
- 导入资源文件访问的资源文件到当前项目,这样我就可以使用
io/resource
将资源复制到文件中是您的答案。如错误消息所述,jar内的资源不是文件。这不是类路径问题,它是一个基本事实,即jar中的资源不是文件。 – noisesmith
“不是文件”似乎是Java告诉我无法从不存在的资源中创建文件的方式。在'midi.soundfont.fluid-r3'项目(其资源目录包含该文件)的类路径上运行时运行'(io/file(io/resource“fluid-r3.sf2”))',但会抛出在任何其他项目中运行时“不是文件”异常。 –
为了澄清,我能够将资源复制到文件。问题是从一个不同的项目做到这一点。那有意义吗? –