从java调用clojure函数但无法找到classpath

时间:2015-03-19 18:48:13

标签: 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>

1 个答案:

答案 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,您可能还需要查看它。