如何从Go调用Java代码而无需为每个调用调用JVM?

是否可以(如果可以,推荐的方式是)从开始,而无需为每个函数调用都启动JVM?</ p>

即,是否有等同于 用于python的jpype解决方案,该解决方案使您可以一次启动JVM,然后使用已经启动的JVM导入Java类并调用它们?</ p>
</ div>

展开原文

原文

Is it possible (and if so, what is the recommended way) to call java code from Go, without the need to start the JVM for every function call?

I.e, is there any equivalent to the jpype solution for python, which lets you start the JVM once, and then import java classes and call them, using the already started up JVM?

douzhuo2722
douzhuo2722 现在已经找到了:NailGun:martiansoftware.com/nailgunQuote:“Nailgun是一种客户端,协议和服务器,可从命令行运行Java程序而不会引起JVM启动开销……”
6 年多之前 回复

3个回答



使用 cgo </ a>调用使用 JNI调用API ,然后使用JNI接口调用Java代码。 由于goroutine在技术上可以在本机线程之间进行切换,因此在进入和退出Go代码和/或使用诸如pthreads之类的本机线程库进行补充时,您可能必须非常谨慎地测试,将线程附加到JVM和将其分离到JVM。 / p>
</ div>

展开原文

原文

Use cgo to call into C code that creates a JVM instance using the JNI invocation API, and call into Java code using the JNI interface. As goroutines can technically switch between native threads, you'll probably have to be very careful about testing, attaching and detaching threads to the JVM upon entry and exit from Go code and/or supplement with use of a native threads library like pthreads.



将Java代码捆绑在“服务器”中,并使用RPC(如“ rest / soap / thrift”)进行调用,并保持服务器运行。 我不知道有哪个系统可以为您自动执行此操作。</ p>
</ div>

展开原文

原文

Bundle your java code in a "server" and call it with RPC like "rest/soap/thrift" and keep the server running. I don't know of any system that automate this for you though.

du970294
du970294 对不起,没有机会。 如果您需要这种快速的延迟水平,则可能需要研究在Unix套接字上使用定制协议。 这种方法将允许您最初使用文本编组,例如JSON,以期在需要时将其优化为二进制协议。
接近 7 年之前 回复
dongyan9950
dongyan9950 感谢提示,skyde和@ Rick-777。 我想REST调用要付出一些代价吗? 我喜欢Java在JPype中的调用方式,至少要不到毫秒。REST http服务可以做到这一点吗?
接近 7 年之前 回复
duaj39673
duaj39673 通过Dropwizard,dropwizard.codahale.com提供了Java服务器端应用程序的有用包装,该软件包将Jetty,Jackson和Jersey捆绑在一起,以Java生成高性能的REST-ful Web服务。 您构建一个包含其自己的Web服务器和所有内容的“胖” jar,然后通过REST / HTTP调用其服务。 启动服务只需要启动一次JVM,您可以从Go中启动。
接近 7 年之前 回复



您可以在Java中创建一个Java管理类,该类可以与Go程序进行对话,并且可以运行一次,并且可以 当您的Go程序要求其他Java代码时,适当的调用。</ p>
</ div>

展开原文

原文

You can make a Java management class in Java which is capable of talking to your Go program, and which you run once and will make the appropriate calls to other Java code when your Go program asks for them.

duancaiyi7567
duancaiyi7567 您可以使用任何类型的进程间通信。 如果您的Go程序启动了Java程序,则可以使用exec.Command golang.org/pkg/os/exec来运行java -jar,并读取和写入Stdin和Stdout,以及在Java程序中读取和写入 System.in和System.out
接近 7 年之前 回复
doutongya8378
doutongya8378 任何代码片段或有关如何执行此操作的指南?
接近 7 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐