从java调用clojure函数,但找不到类路径



我试图从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>

看起来您正在使用Maven构建一个Java项目,同时添加了一点Clojure。这应该可行,但需要与当前布局略有不同的布局。如异常消息中所示,Clojure的编译器希望在com/foo/names.clj的类路径上找到命名空间com.foo.names的源代码作为资源。

在Maven标准目录布局中,src/main/java源文件所在的位置,不会添加到项目的类路径中。对于类路径中需要的资源文件,需要src/main/resources:

在生成工件的源目录(即主目录和测试目录)中,有一个目录用于java语言(在该目录下存在正常的包层次结构),还有一个用于资源(在给定默认资源定义的情况下,复制到目标类路径的结构)。

尝试将Clojure文件放在src/main/resources/com/foo/names.clj。这应该可以解决导致异常的直接原因。

如果如评论中所示,您希望项目的Clojure代码本身被视为源代码,那么请查看Clojure Maven插件。这应该允许您将Clojure源代码放在src/main/clojure下,并将其与Java代码一起编译,编译后的Clojure代码在类路径中可用。

如果您的项目主要在Clojure中,那么Clojure生态系统中最常见的构建框架是Leiningen,您可能还想看看它。

最新更新