Gewusst wie: laden von Programm-Ressourcen in Clojure
Wie wollen Sie laden das Programm Ressourcen wie icons, strings, grafische Elemente, scripts, und so weiter in einer Clojure-Programm? Ich bin mit einem Projekt-layout, ähnlich wie in vielen Java-Projekten, in denen es eine "Ressourcen" - Verzeichnis hängt von der "source" - Verzeichnis. Eine jar-Datei erstellt, von der Quelle und umfasst die Ressourcen, aber ich kann nicht scheinen, um die Ressourcen geladen, als würde ich in Java.
Das erste, was ich versuchte, war so etwas wie
(ClassLoader/getSystemResource "resources/myscript.js")
Konnte aber nie finden Sie die Ressource.
Sie können tun, etwas ähnliches mit
...
(let [cls (.getClass net.mydomain.somenamespace)
strm (.getResourceAsStream cls name) ]
...
wo ist name der name
von der Ressource zu laden, aber der stream ist nil
.
Können Sie versuchen, über das context-class-loader mit so etwas wie
...
(let [thr (Thread/currentThread)
ldr (.getContextClassLoader thr)
strem (.getResourceAsStream ldr name)]
...
Aber strem
ist immer null.
In der frustration, ich habe habe versucht, indem Sie die Ressource-Dateien in jedem Verzeichnis in das Programm. Sie kopiert in die jar richtig, aber ich kann immer noch nicht scheinen, um diese zu laden.
Ist, habe ich mich an der Sprache der Quellen für die load
Funktion und die run-time-Bibliothek, bin aber nicht "bekommen" es.
Jede mögliche Hilfe würde geschätzt.
BEARBEITEN: Hier ist ein mehr konkretes Beispiel. In Java, wenn Sie wollte zum konvertieren von MarkDown zu HTML, könnten Sie die showdown.js
script und schreiben Sie 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 erstellen, alles wird kompiliert und verpackt in einem Glas. Wenn ausführen, wird das Programm gibt <p>plain, <em>emphasis</em>, <strong>strong</strong></p>
Eine wörtliche übersetzung, Clojure scheint ziemlich einfach, aber ich habe Probleme beim erstellen der InputStreamReader
-- ich kann nicht scheinen, den code zu schreiben brauchten, um die Skript-Datei in die jar.
Bearbeiten: Hinzugefügt "markdown" - tag da die post gibt zwei komplette Beispiele von Ansätzen zur Verarbeitung von markdown.
- könntest du ein Beispiel in java?
- Hat ein konkretes Beispiel in Java. Wie würde man das gleiche erreichen in Clojure?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist die Verzeichnis-Struktur.
Weiter mit der scripting-engine Beispiel im OP, ein Clojure-äquivalent wäre:
Beachten Sie, dass der Pfad zu den Ressourcen ist
com/domain/resources
für diesen code als Gegensatz zucom/domain/scriptingtest/resources
in der Java-version. In der clojure-version, der source-Dateiexample.clj
ist incom/domain
. In der Java-version der Quellcode-DateiExample.java
ist in dercom/domain/scriptingtest
Paket.Beim einrichten eines Projekts in meiner IDE, NetBeans, Java-Projekt-Assistent fragt nach einem umschließenden Paket für die Quelle. Die Clojure-plugin, enclojure, fragt nach einem namespace, nicht ein Paket. Ich hatte nie bemerkt, dass der Unterschied vor. Daher der "off-by-one" Fehler in der Verzeichnisstruktur erwartet.
können Sie auch clojure.lang.RT/baseLoader
Ich die Datei abgelegt testpkg/test.txt (relativ zum aktuellen Verzeichnis).
Code:
$ java -cp .\;clojure.jar clojure.Haupt-test.clj