如何在 Clojure 程序中加载图标、字符串、图形元素、脚本等程序资源?我使用的项目布局类似于许多 Java 项目中的布局,其中有一个“资源”目录挂在“源”目录下。 jar 文件是从源代码创建的并包含资源,但我似乎无法像在 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)]
...
But strem
始终为零。
沮丧的是,我尝试将资源文件放置在程序中的几乎每个目录中。它们被正确复制到罐子中,但我似乎仍然无法加载它们。
我查看了语言源load
函数和运行时库,但我没有“得到”它。
任何帮助,将不胜感激。
EDIT: 这是一个更具体的例子。在 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**"));
}
}
当我创建项目时,它全部被编译并打包到一个 jar 中。运行时,程序输出<p>plain, <em>emphasis</em>, <strong>strong</strong></p>
Clojure 的直译似乎非常简单,但我在尝试创建InputStreamReader
-- 我似乎无法编写在 jar 中查找脚本文件所需的代码。
Edit:添加了“markdown”标签,因为该帖子给出了处理 Markdown 的方法的两个完整示例。