Как вы загружаете программные ресурсы, такие как значки, строки, графические элементы, сценарии и т. Д. В программе Clojure? Я использую макет проекта, аналогичный тому, который используется во многих Java-проектах, где есть каталог ресурсов, висящий от каталога источника. JAR-файл создается из исходного кода и включает в себя ресурсы, но я не могу загрузить ресурсы, как в Java.
Первое, что я попробовал, было что-то вроде
(ClassLoader/getSystemResource "resources/myscript.js")
Но так и не смог найти ресурс.
Вы можете сделать что-то похожее с
...
(let [cls (.getClass net.mydomain.somenamespace)
strm (.getResourceAsStream cls name) ]
...
где name - это name
ресурса для загрузки, но поток - nil
.
Вы можете попробовать использовать загрузчик классов контекста с чем-то вроде
...
(let [thr (Thread/currentThread)
ldr (.getContextClassLoader thr)
strem (.getResourceAsStream ldr name)]
...
Но strem
всегда равен нулю.
В отчаянии я попытался разместить файлы ресурсов почти в каждом каталоге программы. Они правильно копируются в банку, но я все еще не могу их загрузить.
Я посмотрел источники языка для функции load
и библиотеки времени выполнения, но не получаю ее.
Любая помощь будет оценена.
РЕДАКТИРОВАТЬ : Вот более конкретный пример. В Java, если вы хотите конвертировать MarkDown в HTML, вы можете использовать скрипт showdown.js
и написать что-то вроде:
package scriptingtest;
import java.io.InputStreamReader;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class Example {
private Object converter;
public String transformMarkDown(String markdownString) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
try {
engine.eval(new InputStreamReader(getClass().getResourceAsStream(
"resources/showdown.js")));
converter = engine.eval("new Showdown.converter()");
} catch (Exception e) {
return "Failed to create converter";
}
try {
return ((Invocable) engine).invokeMethod(converter, "makeHtml",
markdownString).toString();
} catch (Exception e) {
return "Conversion failed";
}
}
public static void main(String[] args) {
System.out.println(new Example().transformMarkDown("plain, *emphasis*, **strong**"));
}
}
когда я создаю проект, все это компилируется и упаковывается в банку. При запуске программа выдает <p>plain, <em>emphasis</em>, <strong>strong</strong></p>
Дословный перевод Clojure кажется довольно простым, но я столкнулся с проблемой при попытке создать InputStreamReader
- я не могу написать код, необходимый для поиска файла сценария в банке.
Редактировать : Добавлен тег «уценка», поскольку в посте приведены два полных примера подходов к обработке уценки.