Trong bài viết này, Lập trình không khó xin chia sẻ cách để chúng ta có thể viết wrapper python cho java project theo một số cách khác nhau. Nói tường minh ra là mình sẽ hướng dẫn các bạn cách để gọi code java từ python. Trên thực tế, có nhiều cách để chúng ta có thể làm việc này. Mình sẽ liệt kê các phương pháp mà mình biết, và mình sẽ cố gắng diễn đạt chi tiết nhất có thể, và tất nhiên là sẽ có code ví dụ đi kèm rồi.
Tại sao lại cần wrapper python cho java?
Trước khi bắt đầu bài chia sẻ, mình sẽ nói qua một số trường hợp chúng ta cần phải có sự kết nối giữa các ngôn ngữ khác nhau, và vấn đề “sử dụng python để gọi code java” cũng chỉ là một trường hợp nhỏ của vấn đề chung này.
Dự án của bạn được triển khai thành nhiều module, mỗi module lại sử dụng một ngôn ngữ lập trình khác nhau. Lấy một ví dụ: Bạn có một website tin tức sử dụng PHP nhưng lại có một module gợi ý bài viết tương tự dùng Python(vì triển khai máy học trên python rất dễ trong khi PHP thì rất khó).
Trên thực tế, do mỗi ngôn ngữ lập trình sinh ra với những mục đích khác nhau, chẳng hạn php thì chuyên để code web back-end, còn python thì hỗ trợ cực tốt cho machine learning… Do đó, mỗi chức năng của một phần mềm tổng thể sẽ có thể được viết bằng các ngôn ngữ khác nhau. Xét về hiệu năng, nếu bạn có thể sử dụng một ngôn ngữ duy nhất cho cả hệ thống thì sẽ tối ưu hơn rất nhiều. Tuy nhiên, điều này không phải lúc nào cũng khả thi. Thực tế thì việc code mỗi module một ngôn ngữ khác nhau và sau đó ghép chúng lại vẫn đơn giản và tiết kiệt hơn nhiều so với việc cố gắng sử dụng một ngôn ngữ duy nhất.
Quan trọng hơn hết, việc kết nối các ngôn ngữ khác nhau ở thời điểm hiện tại rất là đơn giản. Trong bài này, mình sẽ chỉ tập trung vào hướng dẫn gọi code java từ python và cũng chỉ tập trung vào cách được bôi đậm dưới đây:
- Sử dụng ngôn ngữ Python gọi tới lệnh [command line chạy code java] và lấy kết quả.
- Sử dụng python để gọi [Java API]; Java API cung mở kết nối để mọi ngôn ngữ lập trình có thể request tới, tất nhiên Python cũng có thể gọi tới.
- Sử dụng thư viện Py4j để gọi code Java
Cách viết wrapper python cho java
Hiện nay, việc kết nối giữa các ngôn ngữ với nhau đa phần là sử dụng API. Vì API có rất nhiều ưu điểm:
- Source code của bạn được bảo mật 100%. Người sử dụng sẽ không thể thấy code của bạn
- Mọi ngôn ngữ lập trình đều có thể sử dụng, sử dụng rất dễ dàng & đơn giản
- API hỗ trợ đa luồng, chạy multi-thread
Tuy nhiên, trong bài này mình sẽ tập trung vào việc hướng dẫn sử dụng thư viện Py4j để gọi code Java từ bên Python. Bây giờ chúng ta sẽ đi theo từng bước nhé:
- Tạo project Java sử dụng Maven
- Build thư viện cho project java để thu được file *.jar
- Gọi hàm của java từ Python sử dụng Py4j
1. Tạo project Java sử dụng Maven
Các bạn lưu ý giúp mình, mình sẽ tạo java project sử dụng Maven để thuận tiện trong việc sử dụng các thư viện nhé. Maven cung cấp cho chúng ta việc sử dụng các thư viện cực kỳ đơn giản.
Mở IntelIJ Idea, tạo mới một Maven Project:
Dưới đây là cấu trúc của Project sau khi tạo. Tôi đã tạo thêm một file HelloWorld.java nữa
Class HelloWorld sẽ có một hàm là getMessage()
. Vì đây là bài hướng dẫn nên tôi sẽ chỉ viết đơn giản đủ để demo. Và việc chúng ta mong muốn là code python có thể gọi tới hàm này. Dưới đây là source code của file HelloWorld.java
public class HelloWorld { private String message; public HelloWorld(String message) { this.message = message; } public String getMessage() { return message; } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld("Hello"); System.out.println(helloWorld.getMessage()); } }
2. Build file .jar từ cho java project
B1. Tại Menu của InteliJ IDEA, chọn File => Project Structure (Ctrl + Alt + Shift + S)
B2. Tại cửa sổ này, làm theo hướng dẫn của các ảnh dưới đây để build file .jar cho class HelloWorld
Lưu ý: Bạn nhớ sửa Directory for META-INF/MAINFEST.MF thành như sau:
# Ban đầu /home/lap60313/sources/java/JavaPythonExample/src/main/java # Sửa thành # Thay java thành resources nhé /home/lap60313/sources/java/JavaPythonExample/src/main/resources
B3. Build file java bằng cách vào Menu Build => Build Artifacts. Chọn Jar module vừa tạo và tiến hành Build là ta sẽ được file jar ở thư mục /out của project rồi.
B4. Chạy thử
$ cd out/artifacts/JavaPythonExample_jar/ $ java -jar JavaPythonExample.jar >>> Hello
Nếu ta cũng nhận được message hello thì ok rồi.
3. Thực hiện gọi code java bằng python
Bây giờ bạn copy file jar vừa build được tới chỗ code python của bạn là được. Chúng ta sẽ bắt đầu viết wrapper python cho nó.
Đầu tiên, bạn hãy cài đặt thư viện py4j cho python nhé.
$ pip install py4j
Giả sử mình viết file có tên wrapper.py
nằm cùng thư mục với file jar chúng ta vừa build được:
|____ JavaPythonExample.jar |____ wrapper.py
Nội dung của file wrapper.py như sau:
from py4j.java_gateway import JavaGateway gateway = JavaGateway.launch_gateway(classpath="JavaPythonExample.jar", die_on_exit=True) sayer = gateway.jvm.HelloWorld("XIN CHAO NGUYENVANHIEU.VN") print(sayer.getMessage())
Lưu ý: Nếu file java class của bạn nằm trong 1 package nào đó thì bạn phải thêm package vào nhé. Ví dụ class HelloWorld
nằm trong package com.hieunv
thì bạn cần viết thành:
sayer = gateway.jvm.com.hieunv.HelloWorld("XIN CHAO NGUYENVANHIEU.VN")
Giờ bạn hãy chạy thử code wrapper.py xem sao nhé
$ python wrapper.py XIN CHAO NGUYENVANHIEU.VN
Hi vọng bài viết mang lại những kiến thức bổ ích cho bạn đọc!
Để lại một bình luận