[英]Clojure interop with Java: how to call a class?
我有一個Java應用程序,該應用程序在標准Maven布局內的該地址處有一個類:
src/main/java/com/ollio/nlp/Transformer.java
我想要的類和方法如下所示:
package com.ollio.nlp;
public class Transformer {
public String transform(String JSONInput) {
我將罐子工件本地存儲在我的Clojure應用程序中的以下地址:
maven_repository/local/nlp/1.0-SNAPSHOT/nlp-1.0-SNAPSHOT.jar
我嘗試了十幾種將其導入我的Clojure應用程序的方法,例如:
(:import
[com.ollio.nlp.Transformer])
但是我一直收到錯誤消息“沒有這樣的命名空間”。
導入此內容的正確方法是什么?
編輯:
這是我目前嘗試執行導入語句的方式:
(ns slick.query
(:import
[nlp.*])
我也嘗試過:
(ns slick.query
(:import
[com.ollio.nlp.*])
我嘗試了其他一些變體。
project.clj文件如下所示:
(defproject slick "0.1"
:description "slick is an API for other ollio services, such as our mobile app."
:dependencies [[org.clojure/clojure "1.6.0"]
[com.taoensso/timbre "3.2.1"]
[dire "0.5.1"]
[slingshot "0.10.3"]
[ring "1.4.0-RC1"]
[clj-time "0.6.0"]
[org.clojure/data.json "0.2.5"]
[compojure "1.3.4"]
[com.novemberain/monger "2.0.1"]
[org.clojure/tools.namespace "0.2.4"]
[manifold "0.1.0"]
[me.raynes/fs "1.4.4"]
[org.clojure/core.incubator "0.1.3"]
[clj-stacktrace "0.2.7"]
[overtone/at-at "1.2.0"]
[ring/ring-json "0.3.1"]
[clj-http "1.1.2"]
[org.clojure/core.cache "0.6.4"]
[cheshire "5.5.0"]
[org.clojure/core.match "0.3.0-alpha4"]
[local/nlp "1.0-SNAPSHOT"]]
:repositories {"local" ~(str (.toURI (java.io.File. "maven_repository")))}
:disable-implicit-clean true
:source-paths ["src/clojure"]
:java-source-paths ["src/java"]
:main slick.core
:aot :all
:jvm-opts ["-Xms100m" "-Xmx1000m" "-XX:-UseCompressedOops"])
如果在一個項目中混合使用Java和clojure源代碼,則應首先查看lein文檔: https : //github.com/technomancy/leiningen/blob/master/doc/MIXED_PROJECTS.md
另外,如果您發布了project.clj和java / clojure源的布局,則更容易發現缺少的內容。
您可能需要將:import
語句的最后一個句點更改為空格:
(ns mynamespace
(:import [com.ollio.nlp Transformer]))
(編輯:您不能在此處使用通配符com.ollio.nlp
每個類com.ollio.nlp
必須明確列出,並用空格分隔。)這將使您可以使用不合格的Transformer
:
(.transform (Transformer. <add constructor args here>) my-json-input)
正如@noisesmith所說, :import
語句應該是ns
聲明的一部分。
該項目的建立方式也很有可能出現問題。 您沒有跡象表明這是可能的,但是我相信,這種情況通常在人們開始使用Java互操作時發生。 (無論如何,這發生在我身上。)因此@AlanThompson的建議可能是有意義的。
您也可以簡單地刪除:import
語句,並以完全限定的形式使用Java類名稱,例如:
(.transform (com.ollio.nlp.Transformer. <add constructor args here>) my-json-input)
如果這樣做時出現錯誤,則可能是安裝問題(除非您使用了不正確的類)。
(我不確定這有多有用。艾倫·湯普森的答案可能是合適的答案。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.