[英]Calling clojure function from java but unable to find classpath
我正在尝试从Java类调用clojure函数,但是即使clojure文件与Java类位于同一位置,它的抛出
线程“主”中的异常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>
看起来您正在使用Maven来构建Java项目,同时还散布了一点Clojure。 这应该可行,但所需的布局将与您当前的布局略有不同。 如异常消息中所示,Clojure的编译器希望在com/foo/names.clj
的类路径上找到命名空间com.foo.names
的源代码作为资源。
在Maven标准目录布局中, src/main/java
是源文件所在的位置,并且不会添加到项目的类路径中。 对于您确实希望在类路径上使用的资源文件,您需要src/main/resources
:
在生成工件的源目录(即main和test)中,有一个目录用于java语言(在其中存在正常的包层次结构),一个目录用于资源(在给定默认资源定义的情况下,该结构被复制到目标类路径中) )。
尝试将Clojure文件放在src/main/resources/com/foo/names.clj
。 这应该可以解决导致异常的直接原因。
如注释中所述,如果您希望自己将项目的Clojure代码本身视为源代码,请查看Clojure Maven插件 。 这应该允许您将Clojure源代码放在src/main/clojure
,并使其与Java代码一起编译,并且已编译的Clojure代码在类路径中可用。
如果您的项目主要在Clojure中,则Clojure生态系统中最常见的构建框架是Leiningen ,您可能还想看看。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.