【发布时间】:2011-01-03 21:40:17
【问题描述】:
如何在 Clojure 程序中加载程序资源,例如图标、字符串、图形元素、脚本等?我使用的项目布局类似于许多 Java 项目中的项目布局,其中有一个“资源”目录挂在“源”目录之外。从源代码创建了一个 jar 文件并包含资源,但我似乎无法像在 Java 中那样加载资源。
我尝试的第一件事是
(ClassLoader/getSystemResource "resources/myscript.js")
但永远找不到资源。
你可以做类似的事情
...
(let [cls (.getClass net.mydomain.somenamespace)
strm (.getResourceAsStream cls name) ]
...
其中 name 是要加载的资源的 name,但流是 nil。
您可以尝试将上下文类加载器与类似的东西一起使用
...
(let [thr (Thread/currentThread)
ldr (.getContextClassLoader thr)
strem (.getResourceAsStream ldr name)]
...
但strem 始终为零。
无奈之下,我尝试将资源文件放在程序中的几乎每个目录中。它们被正确复制到 jar 中,但我似乎仍然无法加载它们。
我查看了 load 函数和运行时库的语言源,但没有“得到”它。
任何帮助将不胜感激。
编辑:这是一个更具体的例子。在 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 中查找脚本文件所需的代码。
编辑:添加了“markdown”标签,因为该帖子提供了两个处理降价方法的完整示例。
【问题讨论】:
-
你能在java中添加一个例子吗?
-
@arthur:在 Java 中添加了一个更具体的示例。你将如何在 Clojure 中完成同样的事情?
标签: java interop resources clojure markdown