我试图从java类调用clojure函数,但即使clojure文件与java类位于同一个地方,它的抛出
线程“main”中的异常java.io.FileNotFoundException:不能 找到com / foo / names__init.class或 类路径上的com / foo / names.clj。
这是我的项目结构:
src
main
java
com
foo
names.clj
TestClj.java
names.clj
(ns com.foo.names)
(defn add-me
[one two]
(+ one two))
TestClj.java
public class TestClj {
private static final IFn REQUIRE = Clojure.var("clojure.core", "require");
public TestClj(String ns) {
this.ns = ns;
REQUIRE.invoke(Clojure.read(ns)); <- Breaks here
}
public static void main(String[] args) {
TestClj clj = new TestClj("com.foo.names");
Clojure.var("com.foo.names", "add-me").invoke(1, 2);
}
}
我在这里缺少什么?
编辑添加pom文件
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.clojure</groupId>
<artifactId>clojure</artifactId>
<version>1.7.0-alpha5</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.clojure</groupId>
<artifactId>clojure</artifactId>
<scope>compile</scope>
</dependency>
</dependencies>
<repositories>
<repository>
<id>clojars.org</id>
<name>Clojars repository</name>
<url>https://clojars.org/repo</url>
</repository>
</repositories>
答案 0 :(得分:1)
看起来你正在使用Maven构建一个Java项目,旁边还有一点Clojure。这应该可行,但需要的布局与您目前的布局略有不同。如异常消息所示,Clojure的编译器期望在com.foo.names
的类路径上找到名称空间com/foo/names.clj
的源代码作为资源。
在Maven standard directory layout src/main/java
中源文件所在的位置,并未添加到项目的类路径中。对于您在类路径上需要的资源文件,您需要src/main/resources
:
在工件生成源目录(即main和test)中,有一个用于语言java的目录(在其下存在正常的包层次结构),以及一个用于资源的目录(在给定的情况下复制到目标类路径的结构)默认资源定义)。
尝试将Clojure文件放在src/main/resources/com/foo/names.clj
。这应该可以解决您的异常的直接原因。
如果如评论所示,您希望项目的Clojure代码本身被视为源代码,那么请查看Clojure Maven plugin。这应该允许您将Clojure源代码放在src/main/clojure
下,并将其与Java代码一起编译,并在类路径中使用已编译的Clojure代码。
如果您的项目主要在Clojure中,那么Clojure生态系统中最常见的构建框架是Leiningen,您可能还需要查看它。