Wie laden Sie Programmressourcen wie Symbole, Zeichenfolgen, grafische Elemente, Skripte und so weiter in einem Clojure-Programm? Ich verwende ein Projekt-Layout, das dem in vielen Java-Projekten ähnlich ist, wo ein "Ressourcen" -Verzeichnis an einem "Quell" -Verzeichnis hängt. Eine JAR-Datei wird aus der Quelle erstellt und enthält die Ressourcen, aber ich kann nicht scheinen, dass die Ressourcen wie in Java geladen werden.Wie Programmressourcen in Clojure geladen werden
Das erste, was ich versuchte, war so etwas wie
(ClassLoader/getSystemResource "resources/myscript.js")
konnte aber nie die Ressource finden.
Sie können etwas Ähnliches tun mit
...
(let [cls (.getClass net.mydomain.somenamespace)
strm (.getResourceAsStream cls name) ]
...
wobei Name der name
der Ressource zu laden, aber der Strom ist nil
.
Sie können versuchen, den Kontext Class Loader mit mit so etwas wie
...
(let [thr (Thread/currentThread)
ldr (.getContextClassLoader thr)
strem (.getResourceAsStream ldr name)]
...
Aber strem
ist immer gleich Null.
In Frustration habe ich versucht, die Ressourcen-Dateien in fast jedem Verzeichnis im Programm zu platzieren. Sie werden korrekt in das Glas kopiert, aber ich kann sie immer noch nicht laden.
Ich habe die Sprachquellen für die load
-Funktion und die Laufzeitbibliothek angeschaut, aber ich "bekomme" es nicht.
Jede Hilfe wäre willkommen.
EDIT: Hier ist ein konkreteres Beispiel. In Java, wenn Sie Markdown in HTML konvertieren wollen, könnten Sie die showdown.js
Skript verwenden und schreiben so etwas wie:
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**"));
}
}
, wenn ich das Projekt zu erstellen, das alles in ein Glas gesammelt und verpackt wird. Wenn er ausgeführt wird, gibt das Programm <p>plain, <em>emphasis</em>, <strong>strong</strong></p>
Eine wörtliche Übersetzung Clojure ziemlich einfach scheint, aber ich laufe in Mühe versuchen, die erstellen InputStreamReader
- ich kann nicht scheinen, um den Code zu schreiben, benötigt die Skriptdatei in das Glas zu finden .
Bearbeiten: Hinzugefügt "Markdown" -Tag seit der Post gibt zwei vollständige Beispiele für Ansätze zur Verarbeitung Markdown.
könnten Sie ein Beispiel in Java hinzufügen? –
@arthur: Ein konkreteres Beispiel in Java hinzugefügt. Wie würdest du dasselbe in Clojure erreichen? – clartaq