簡體   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