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

从Java调用clojure(Clojure Interop)

荆哲
2023-03-14

从Clojoure调用Java非常简单明了,但反过来已被证明是不可预测的。

它们似乎有两种方式:

1)以下类别

      i) import clojure.java.api.Clojure; ,
     ii) import clojure.lang.IFn;

2) 将clojure编译成uberjar,然后将其导入java代码。

我选择了第二个选项,因为它更直接。

这是clojure代码

(ns com.test.app.service
 (:gen-class
       :name com.test.app.service
       :main false
       :methods [^{:static true} [returned [int] int]]))

    (defn returned
      [number]
      (* 2 number))

    (defn -returned
      [number]
      (returned number))

这是Java代码。

package com.s.profile;

import java.util.*;
import com.microsoft.azure.serverless.functions.annotation.*;
import com.microsoft.azure.serverless.functions.*;
import com.test.app.service;


/**
 * Azure Functions with HTTP Trigger.
 */
public class Function {
    /**
     * This function listens at endpoint "/api/hello". Two ways to invoke it using "curl" command in bash:
     * 1. curl -d "HTTP Body" {your host}/api/hello
     * 2. curl {your host}/api/hello?name=HTTP%20Query
     */
    @FunctionName("hello")
    public HttpResponseMessage<String> hello(
            @HttpTrigger(name = "req", methods = {"get", "post"}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {
        context.getLogger().info("Java HTTP trigger processed a request.");

        // Parse query parameter
        String query = request.getQueryParameters().get("name");
        String name = request.getBody().orElse(query);

        if (name == null) {
            return request.createResponse(400, "Please pass a name on the query string or in the request body");
        } else {
            service.returned(4);
            context.getLogger().info("process data" );
            return request.createResponse(200, "Hellos, " + name );
        }
    }
}

当我做出“service.returned(4);”时,系统永远不会返回。我不太明白为什么对我来说,它会像函数没有从Clojure返回一样关闭,但我看不到原因。

只是为了添加一些上下文,我已经尝试过它,因为它是一个简单的hello world java应用程序,它只是打印出结果并且它的工作原理。当我尝试在 Azure 函数中实现它时。

共有2个答案

越飞语
2023-03-14

我按照这些指示,它似乎解决了类没有找到的错误。似乎当运行这个命令时

mvn azure-functions:run

它不会自动查找所有导入的库。你要么用

    < Li > maven-汇编-插件 < li>maven-shade-plugin
邢勇
2023-03-14

请查看运行示例的问题:

如何直接从Java调用Clojure函数

我建议首先简化您的代码,然后在Azure中一次添加一行代码,以防某些交互导致问题。

 类似资料:
  • 问题内容: 对于“从Java调用Clojure”而言,大多数Google热门歌曲都已过时,建议您使用它clojure.lang.RT来编译源代码。假设您已经从Clojure项目构建了一个jar并将其包含在类路径中,那么您能否帮助您清楚地说明如何从Java调用Clojure? 问题答案: 从Clojure 1.6.0开始,有一种新的首选方式来加载和调用Clojure函数。现在,此方法优于直接调用RT

  • 我按照本教程使用Leiningen从Eclipse中的Java调用Clojure。我想在Clojure中编写游戏的AI,其余的则在Android操作系统的LibGDX中编写。 完成Clojure端后,我使用lein命令将其打包到jar文件中(#lein编译,#lein运行,#lein uberjar)。 我通过右键单击project添加jar文件 我的问题发生在我执行游戏时。 我收到这个错误: 我

  • 问题内容: 我有Clojure功能。 源代码: https://github.com/8protons/url62/blob/master/src/url62/core.clj 我需要从Java执行此功能。 我尝试使用这样的代码: 但这不起作用: 问题答案: 您忘记了Clojure命名空间: 这是项目结构: 和文件: 这是调用嵌入式Clojure函数的Java类: Clojure文件: Cloju

  • 在Java里面调用 Clojure 提前编译的Clojure函数如果是静态的函数的话,那么它们可以被java程序调用。可以通过把函数的元数据项: :static 设置为 true 来达到这个目的。语法是这样的: (ns <em>namespace</em> (:gen-class :methods [#^{:static true} [<em>function-name</em> [<e

  • 问题内容: 我创建了一个xPages应用程序,该应用程序使用了位于服务器端javascript库中的许多服务器端javascript代码功能。 现在,我有一些Java代码位于java设计元素中,我想使用它们来调用javascript函数。 我确实知道从Java调用javascript是不合逻辑的,但是我想所有服务器端javascript都已编译为java,因此我认为可能可以获取所生成的已编译jav

  • 问题内容: 从python调用Java的最佳方法是什么?(对我来说,jython和RPC不是一个选择)。 我听说过JCC:http : //pypi.python.org/pypi/JCC/1.9 一个用于从C / Python调用Java的C 代码生成器,但这需要编译所有可能的调用。我希望有另一个解决方案。 我听说过JPype:http ://jpype.sourceforge.net/ 教程: