我有一个需要与第三方库集成的Java应用程序.该库是用Python编写的,我对此没有任何发言权.我正试图找出与它集成的最佳方式.我正在尝试JEPP(Java嵌入式Python) - 以前有人用过吗?我的另一个想法是使用JNI与Python的C绑定进行通信.
任何关于最佳方式的想法将不胜感激.谢谢.
为什么不使用Jython?我能立即想到的唯一缺点是你的库是否使用CPython原生扩展.
编辑:如果您现在可以使用Jython,但认为您可能有更高版本的库的问题,我建议您尝试将库与您的应用程序隔离(例如某种适配器接口).选择目前最简单的方法,然后考虑JNI/CPython/etc,如果需要的话.除非你真的需要,否则去(痛苦的)JNI路线几乎没有什么好处.
坦率地说,大多数以某种方式直接从JVM中运行Python的方法都不起作用.它们要么不完全兼容(你的第三方库的新版本可以使用python 2.6功能,不能与Jython 2.5一起使用)或hacky(它会破坏神秘的JVM堆栈跟踪,而不是真正导致解决方案).
我首选的方法是使用RPC.如果您有适量的数据,XML RPC在这里不是一个糟糕的选择.它得到了很好的支持 - Python在其标准库中有它.Java库也很容易找到.现在,根据您的设置,Java或Python部分将是服务器接受来自其他语言的连接.
一个不那么受欢迎但值得考虑的另一种做RPC的方法是Google protobuffers,它有很好的rpc支持的2/3 .您只需提供传输层即可.没那么多的工作和写作的便利是合理的.
另一个选择是编写一个C包装器,围绕那些需要向Java公开并通过JVM本机插件使用它的Python功能.使用SWIG SWIG可以缓解疼痛 .
基本上在你的情况下,它的工作原理如下:
为从Java到C++的所有方法调用创建SWIG接口.
创建将接收您的调用的C/C++代码,并使用右侧参数在内部调用python解释器.
转换从python获得的响应,并通过swig将其发送回Java代码.
这个解决方案相当复杂,在大多数情况下有点过分.如果你(出于某种原因)无法负担RPC,那么值得做.但RPC仍然是我的首选.
许多年后,只是添加一个更受欢迎的选项......
如果你需要CPython功能,py4j是一个不错的选择.py4j已经看到频繁的更新20162017年并且已经获得了一些普及,因为它被例如Apache Spark用于实现CPython互操作性.
我的另一个想法是使用JNI与Python的C绑定进行通信.
我非常喜欢JNA:
JNA为Java程序提供了对本机共享库(Windows上的DLL)的轻松访问,而无需编写除Java代码之外的任何内容 - 不需要JNI或本机代码.此功能可与Windows的Platform/Invoke和Python的ctypes相媲美.访问在运行时是动态的,无需生成代码.
我的0.02美元:)
您可以使用像ActiveMQ这样的消息服务.它同时支持Python和Java.这样,您可以保留复杂的JNI或C绑定,并且只处理我认为简单的接口.此外,当库得到更新时,您无需进行太多更改(如果有的话).