从 Java 调用 clojure (Clojure Interop)
calling clojure from Java (Clojure Interop)
从 Clojoure 调用 Java 非常简单明了,但事实证明反过来是不可预测的。
他们似乎有两种做法:
1)the following classes
i) import clojure.java.api.Clojure; ,
ii) import clojure.lang.IFn;
2)compile your clojure into an uberjar then import it into the java
code.
我选择了第二个选项,因为它更直接。
这是 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);" 时,系统永远不会 return。我不太明白为什么对我来说它会像 Clojure 中的函数不 return 那样消失,但我看不出原因。
只是为了添加一些上下文,当它是一个简单的 hello world java 应用程序时,我已经尝试过它,它只打印出结果并且可以正常工作。这是我尝试在 Azure 函数中实现它的时候。
请参阅此问题以获取 运行 示例:
我建议首先简化您的代码,然后在 Azure 中一次添加一行,以防某些交互导致问题。
我遵循了这些 instructions,它似乎解决了 class not found 的错误。好像当 运行 命令
mvn azure-functions:run
它不会自动找到所有导入的库。您要么必须使用
- maven-assembly-plugin
- maven-shade-插件
从 Clojoure 调用 Java 非常简单明了,但事实证明反过来是不可预测的。
他们似乎有两种做法:
1)the following classes
i) import clojure.java.api.Clojure; , ii) import clojure.lang.IFn;
2)compile your clojure into an uberjar then import it into the java code.
我选择了第二个选项,因为它更直接。
这是 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);" 时,系统永远不会 return。我不太明白为什么对我来说它会像 Clojure 中的函数不 return 那样消失,但我看不出原因。
只是为了添加一些上下文,当它是一个简单的 hello world java 应用程序时,我已经尝试过它,它只打印出结果并且可以正常工作。这是我尝试在 Azure 函数中实现它的时候。
请参阅此问题以获取 运行 示例:
我建议首先简化您的代码,然后在 Azure 中一次添加一行,以防某些交互导致问题。
我遵循了这些 instructions,它似乎解决了 class not found 的错误。好像当 运行 命令
mvn azure-functions:run
它不会自动找到所有导入的库。您要么必须使用
- maven-assembly-plugin
- maven-shade-插件