在Ubuntu上集成Java与Python的常见方法
JPype是Python直接调用Java类库的工具,支持Python3,无需额外运行时环境。
sudo apt update
sudo apt install openjdk-11-jdk
验证安装:java -version(需显示Java版本信息)。pip3 install JPype1
TestDemo.java),编译并打包为JAR:javac TestDemo.java
jar cvf TestDemo.jar TestDemo.class
from jpype import *
# 启动JVM(指定JAR路径)
startJVM("/usr/lib/jvm/java-11-openjdk-amd64/bin/java", "-ea", "-Djava.class.path=./TestDemo.jar")
# 加载Java类并调用方法
TestDemo = JClass("TestDemo")
result = TestDemo.inputTest("Hello from Python!")
print(result) # 输出Java方法返回值
# 关闭JVM
shutdownJVM()
Py4J允许Python与Java进程双向调用,适合复杂交互场景(如Python调用Java方法、Java调用Python函数)。
pip3 install py4j
GatewayServerExample.java),启动Py4J网关:import py4j.GatewayServer;
public class GatewayServerExample {
public String greet(String name) {
return "Hello, " + name + " from Java!";
}
public static void main(String[] args) {
GatewayServer server = new GatewayServer(new GatewayServerExample());
server.start();
System.out.println("Gateway Server started. Connect from Python.");
}
}
编译并运行:javac GatewayServerExample.java
java GatewayServerExample
from py4j.java_gateway import JavaGateway
# 连接Java网关(默认端口25333)
gateway = JavaGateway()
# 获取Java对象并调用方法
java_obj = gateway.entry_point
result = java_obj.greet("Python")
print(result) # 输出:Hello, Python from Java!
通过HTTP协议实现Java与Python的解耦通信,适合分布式系统。
// HelloController.java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/greet")
public String greet(@RequestParam String name) {
return "Hello, " + name + " from Java!";
}
}
使用Maven构建项目并运行(mvn spring-boot:run),服务默认启动在http://localhost:8080。requests库发送HTTP请求:import requests
# 调用Java RESTful API
response = requests.get("http://localhost:8080/greet?name=Python")
print(response.text) # 输出:Hello, Python from Java!
gRPC是基于HTTP/2的高性能跨语言框架,适合大规模数据传输。
example.proto文件:syntax = "proto3";
package example;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
protoc编译器生成代码:# 安装protoc(若未安装)
sudo apt install protobuf-compiler
# 生成Java代码
protoc --java_out=./java example.proto
# 生成Python代码
protoc --python_out=./python example.proto
SayHello方法。通过RabbitMQ、Kafka等消息队列实现Java与Python的异步通信,适合高吞吐量场景。
sudo apt install rabbitmq-server
sudo systemctl start rabbitmq-server
pika库接收Java发送的消息:import pika
# 连接RabbitMQ服务器
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
# 声明队列
channel.queue_declare(queue='java_python_queue')
# 定义回调函数处理消息
def callback(ch, method, properties, body):
print(f"Received: {body.decode()}")
# 消费消息
channel.basic_consume(queue='java_python_queue', on_message_callback=callback, auto_ack=True)
print('Waiting for messages...')
channel.start_consuming()
JAVA_HOME、PATH)。pip管理Python依赖。根据具体需求(如实时性、复杂度、性能)选择合适的集成方法。