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?
InformationsquelleAutor clartaq | 2010-01-11
Schreibe einen Kommentar