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