我想要做的是在獨立的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」))',但會拋出在任何其他項目中運行時「不是文件」異常。 –
爲了澄清,我能夠將資源複製到文件。問題是從一個不同的項目做到這一點。那有意義嗎? –