Как Вы загружаете ресурсы программы, такие как значки, строки, графические элементы, сценарии, и так далее в программе Clojure? Я использую расположение проекта, подобное этому во многих проектах Java, где существует каталог "ресурсов", зависающий прочь "исходного" каталога. Файл банки создается из источника и включает ресурсы, но я, может казаться, не загружаю ресурсы, как я был бы в Java.
Первая вещь, которую я попробовал, была чем-то как
(ClassLoader/getSystemResource "resources/myscript.js")
Но никогда не мог находить ресурс.
Можно сделать что-то похожее с
...
(let [cls (.getClass net.mydomain.somenamespace)
strm (.getResourceAsStream cls 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
- Я, может казаться, не пишу код, должен был найти файл сценария в банке.
Править: Добавленный тег "скидки с цены" начиная с сообщения дает два полных примера подходов к обработке скидки с цены.
Это структура каталога.
Продолжая пример пример сценариев в ОП, эквивалент Clojure будет:
(ns com.domain.example
(:gen-class)
(:import (java.io InputStreamReader))
(:import (javax.script ScriptEngineManager ScriptEngine)))
(defn load-resource
[name]
(let [rsc-name (str "com/domain/resources/" name)
thr (Thread/currentThread)
ldr (.getContextClassLoader thr)]
(.getResourceAsStream ldr rsc-name)))
(defn markdown-to-html
[mkdn]
(let [manager (new ScriptEngineManager)
engine (.getEngineByName manager "js")
is (InputStreamReader. (load-resource "showdown.js"))
_ (.eval engine is)
cnv-arg (str "new Showdown.converter().makeHtml(\"" mkdn "\")")]
(.eval engine cnv-arg)))
(defn -main
[]
(println (markdown-to-html "plain, *emphasis*, **strong**")))
обратите внимание, что путь к ресурсам COM / домен / ресурсы
для этого кода, в отличие от COM / домен / Scripttestest / Resources
в версии Java. В версии Clojure исходный файл, Example.clj
находится в COM / Domain
. В версии Java исходный файл, Example.java
находится в пакете COM / Domain / Scripttestest
.
При настройке проекта в My IDE NetBeans Maward проекта Java просит прилагающую пакет для источника. Плагин Clojure, Concoojure, просит пространство имен, а не пакет. Я никогда не отмечал эту разницу раньше. Отсюда ожидается ошибка «Off-On-One» в структуре каталогов.
Я поместил файл в TestPKG / Test.txt (относительно текущего каталога).
код:
(def x 5)
(def nm "testpkg/test.txt")
(def thr (Thread/currentThread))
(def ldr (.getContextClassLoader thr))
(def strem (.getResourceAsStream ldr nm))
(def strem2 (ClassLoader/getSystemResource nm))
(. System/out (println "First Approach:"))
(. System/out (println strem))
(. System/out (println))
(. System/out (println))
(. System/out (println "Second Approach:"))
(. System/out (println strem2))
$ Java -CP. \; Clojure.jar clojure.main test.clj
Первый подход: java.io.buffedinputstream @ 1549f94
Второй подход: Файл: / C: /jsight/javadevtools/Clojure-1.1.0/testpkg/test.txt
вы можете также используйте clojure.lang.RT / baseLoader
(defn serve-public-resource [path]
(.getResourceAsStream (clojure.lang.RT/baseLoader) (str "public/" path)))