簡體   English   中英

Java與Clojure互操作:如何調用類?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM