Comment charger des ressources du programme en Clojure
Comment faites-vous pour charger les ressources du programme, tels que des icônes, des cordes, des éléments graphiques, scripts, et ainsi de suite dans un Clojure programme? Je suis à l'aide d'un projet de mise en page similaire à celle dans de nombreux projets Java où il y a un "ressources" annuaire accroché à une "source" de répertoire. Un fichier jar est créé à partir de la source et comprend les ressources, mais je n'arrive pas à obtenir les ressources chargé comme j'aimerais en Java.
La première chose que j'ai essayé était quelque chose comme
(ClassLoader/getSystemResource "resources/myscript.js")
Mais ne pourrait jamais trouver la ressource.
Vous pouvez faire quelque chose de similaire avec
...
(let [cls (.getClass net.mydomain.somenamespace)
strm (.getResourceAsStream cls name) ]
...
où nom est le name
de la ressource à charger, mais le flux est nil
.
Vous pouvez essayer d'utiliser le contexte de la classe loader avec quelque chose comme
...
(let [thr (Thread/currentThread)
ldr (.getContextClassLoader thr)
strem (.getResourceAsStream ldr name)]
...
Mais strem
est toujours nul.
Dans la frustration, j'ai essayé de placer les fichiers de ressources dans à peu près chaque répertoire dans le programme. Elles sont copiées dans le récipient correctement, mais je ne peux toujours pas sembler à les charger.
J'ai regardé les sources en langue pour le load
de la fonction et de la bibliothèque run-time, mais je ne suis pas "se mettre" il.
Toute aide serait appréciée.
MODIFIER: Voici un exemple plus concret. En Java, si vous voulez convertir MarkDown en HTML, vous pouvez utiliser le showdown.js
script et écrire quelque chose comme:
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**"));
}
}
quand j'ai créer le projet, tout sera compilé et emballé dans un bocal. Lorsqu'il est exécuté, le programme des sorties <p>plain, <em>emphasis</em>, <strong>strong</strong></p>
Une traduction littérale de Clojure semble assez simple, mais j'ai un problème en essayant de créer la InputStreamReader
-- je n'arrive pas à écrire le code nécessaire pour trouver le fichier de script dans le pot.
Modifier: Ajout de "markdown" tag depuis l'après donne deux exemples d'approches pour le traitement de markdown.
- pourriez-vous ajouter un exemple en java?
- Ajout d'un exemple plus concret en Java. Comment voulez-vous accomplir la même chose en Clojure?
Vous devez vous connecter pour publier un commentaire.
C'est la structure de répertoire.
Continue avec le moteur de script exemple de l'OP, Clojure équivalent serait:
Notez que le chemin d'accès aux ressources est
com/domain/resources
pour ce code, par opposition àcom/domain/scriptingtest/resources
dans la version de Java. Dans le clojure version, le fichier source,example.clj
est danscom/domain
. Dans la version de Java, le fichier source,Example.java
est dans lecom/domain/scriptingtest
paquet.Lors de la configuration d'un projet dans mon IDE, NetBeans, Java assistant de projet demande un paquet renfermant de la source. Le Clojure plugin, enclojure, demande un espace de noms, pas un paquet. Je n'avais jamais noté que la différence avant. D'où le "tout-en-un" erreur dans la structure de répertoire prévu.
vous pouvez également utiliser clojure.lang.RT/baseLoader
J'ai placé le fichier dans testpkg/test.txt (par rapport au répertoire courant).
Code:
$ java -cp .\;clojure.jar clojure.essai principal.clj