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