当前位置: 首页 > 知识库问答 >
问题:

他们说,从爪哇打电话给Clojure很容易

贺光华
2023-03-14

我是一名初出茅庐的程序员,在eclipse中直接使用Java。我试图让我的Java程序调用从http://dev.clojure.org/display/doc/Getting从Eclipse和逆时针文章开始。hello函数在通过逆时针插件启动的Clojure REPL中运行良好。当我试图从Java类执行hello函数时,会出现问题。

谷歌搜索发现,基本上有两种方法可以做到这一点:clojure。RT可以加载Clojure源代码并将其作为脚本执行,或者在Clojure源代码编译到JAR中时直接执行。

clojure.lang.RT变体工作没有问题,但是我完全不知道如何让直接调用变体工作。在Java文件中,编译器无法解析“myproject.core”。

Clojure源代码core.clj,如下所示,通过REPL像冠军一样工作:

(ns myproject.core
  (:gen-class
    :name myproject.core
    :methods [#^{:static true} [hello [String] String]]))

(defn -main
  "I don't do a whole lot."
  [& args]
  (println "Hello, World!"))

(defn hello [who] (str "Hello " who " !"))

但是,Java源代码不会编译:

import java.io.*;
import clojure.lang.*;
public class HelloJava {
    public static void main( String[] args ) {
        loadResourceVariant();
        directVariant();
    }

    public static void directVariant() {
        myproject.core.hello( "Bob" );
    }

    public static void loadResourceVariant() {
        try {
            RT.loadResourceScript( "myproject/core.clj" );
            // Get a reference to the hello function.
            Var hello = RT.var( "myproject.core", "hello" );
            // Invoke the hello function
            Object result = hello.invoke( "Robert" );
            System.out.println( result );
        } catch ( IOException e ) {
            e.printStackTrace();
        }
    }
}

编译器错误是...

myproject.core cannot be resolved to a type HelloJava.java  /myproject/src  line 11 Java Problem

如何配置逆时针项目以放置。核心的类表示。将clj放入classes目录中,以便可以直接从Java中引用它?

这必须是可能的,而不是完全针对Maven之类的人。不

共有2个答案

家经纶
2023-03-14

我想用户clartaq在这里回答了您的问题:从java调用clojure。

总结一下——如果要将Clojure函数导出到Java,请遵循以下步骤:

  1. 使用完全限定的名称创建项目;e、 g.,lein new com。实例stuff而不仅仅是lein new stuff
  2. 编写一个“包装函数”;e、 g.-foo如果函数被调用foo
  3. 扩展(ns…) 文件顶部的表单以导出函数
  4. 编辑你的项目。clj触发AOT编译的文件
  5. 构建一个uberjar文件

如果想了解我是如何应用这种方法的,请查看我的GitHub页面。

祁承望
2023-03-14

我从java调用Clojure的方法是创建一个api命名空间,通常与实现命名空间分开:

(ns test.api
  (:use [test.impl :only [f1 f2]])
  (:gen-class
    :methods [#^{:static true} [exportedF1 [String] int]
              #^{:static true} [exportedF2 [String String] void]]))

(defn -exportedF1 [^String query ^String file] (f1 query file))
(defn -exportedF2 [^String query] (f2 query))

然后我确保AOT这个名称空间,然后uberjar它。

现在只要把这个jar包含在你的java类路径中,你就可以开始了。

 类似资料:
  • 我试图运行eclipse(我相信是4.15),打开程序后,它给出了一个错误窗口。 我相信是版本问题。然而,我找不到任何关于我的版本不是最新的或太先进。我运行的是Java1.8.0。

  • 我读了一些关于这个问题的帖子,但找不到一个彻底的答案。我有一个有3行的ListView,每行包含一个TextView和一个EditText,还有一个扩展BaseAdapter的自定义适配器。 这是适配器的getView函数: 如您所见,每次值发生变化时,我都尝试用EditText值更新名为RowsList的ColorColumn列表。由于某种原因,onTextChanged方法被调用了太多次,因此

  • 基本上,我试图通过双方的手机号码实现通话。我使用的是PHP laravel。 > 每个代理都有一个各自的表单,用于收集访问者的电话号码。 当代理表格通过访客填写时。 我想让Twilio API先调用代理。 如果代理收到电话,则应拨打访客的电话号码。 并将这两方联系起来。 就这些 正在拨打代理人的电话号码。。但这是我想要的,当代理接到电话时,它应该拨打访客的电话号码。 我已经在这里更新了我的代码。。

  • 我打字的时候 是物体吗? 谁能给我解释一下在java中每样东西都是一个对象?

  • Vert.x Api 是很大程度上由事件驱动的。这意味着,当事情发生在你感兴趣的Vert.x,Vert.x 会通过回调方式向您发送events。 一些示例events: 计时器激活 socket收到数据 从磁盘读取数据 发生了异常 HTTP 服务器收到请求 通过向 Vert.x Api 提供处理程序来处理事件。例如要接收一个计时器事件每一秒你会做: vertx.setPeriodic(1000,

  • 问题内容: 我有这个Java代码段。我是Java的菜鸟。 错误: 码: 问题答案: 是的,这是问题所在: 在课程的最高级别,您只能拥有: 实例初始化程序块() 静态初始值设定块() 变量声明 构造函数声明 方法声明 嵌套类型声明 终结器声明 这些都不是。如果你 的意思 来声明一个变量,你应该这样做: 如果这 不是 您想要的,则应解释您的意图。 编辑:修复此问题后,此编译器错误似乎很明显: Conf