繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM