【问题标题】:calling clojure from Java (Clojure Interop)从 Java 调用 clojure (Clojure Interop)
【发布时间】:2018-02-06 11:37:01
【问题描述】:

从 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 函数中实现它时。

【问题讨论】:

    标签: java clojure clojure-java-interop


    【解决方案1】:

    请参阅此问题以获取运行示例:

    How to invoke Clojure function directly from Java

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

    【讨论】:

    • 谢谢,但如上所述,这不是我想要的方法。我也忘了提,但后来更新了它在基本的 hello world 上工作的问题,这意味着 Clojure 很好。
    【解决方案2】:

    我关注了这些instructions,它似乎解决了找不到类的错误。好像在运行命令时

    mvn azure-functions:run
    

    它不会自动找到所有导入的库。您要么必须使用

    1. maven 组装插件
    2. maven-shade-plugin

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 2011-10-04
      相关资源
      最近更新 更多