Python调用Java代码:JPype库使用指南与注意事项

码头散步
码头散步
发布时间:2026-10-16| 6人浏览过
原创

本文详解如何使用JPype库在Python中调用Java代码及JAR包。涵盖JPype与Jython的区别、安装时的pip与conda兼容性问题、JVM启动参数配置、Java类加载及方法调用示例,并列出默认包不可用、JVM不可重启等限制条件,帮助开发者高效实现跨语言调用。

简介

Python作为一种灵活的开发语言,目前应用极为广泛。在软件开发生态中,经常需要在Python项目中复用已有的Java代码,以此降低开发成本并节省时间。因此,建立Python与Java之间的调用桥梁显得尤为重要。JPype正是为此设计的工具,它允许Python程序便捷地调用Java代码。

JPype使得Python能够直接访问完整的Java类库。与重新实现Python语言的Jython或JPython不同,JPype提供了两个虚拟机之间的接口。这使得在JSP、Servlet、RMI服务器以及IDE插件等场景中,可以使用Python来替代部分Java功能。

缺陷:

位于package之外的类(即处于<default>包中的类)无法被导入。

JVM一旦启动便无法重启。

无法处理依赖于当前类的方法。

安装jpype

pip install jpype1
conda install -c conda-forge jpype1

需注意,pip和conda的安装方式不能混用。若使用pip安装,而在conda环境中调用,可能会遇到找不到import _jpype模块的错误。

java 代码

import java.util.List;
import java.io.*;
import org.ansj.domain.Result;
import org.ansj.domain.Term;
import org.ansj.splitWord.analysis.ToAnalysis;

public class jt {
    public static String formatDuring(long mss) {
        long days = mss / (1000 * 60 * 60 * 24);
        long hours = (mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);
        long minutes = (mss % (1000 * 60 * 60)) / (1000 * 60);
        long seconds = (mss % (1000 * 60)) / 1000;
        return days+"days "+hours + ":" + minutes + ":"
                + seconds + "."+mss%1000;
    }
    public static void main(String[] args)throws IOException, Exception {
        System.out.println(args.length);
        run();
    }

    public static void run(){
        long start = System.currentTimeMillis();
        System.out.println(formatDuring(start));

        String str = "  原标题:港媒:“日本制造”带动日本制造 中国厂商赴日设立生产线  参考消息网9月3日报道 港媒称,日本制造的产品一直以来受大众追捧,近年,越来越多的中国工厂到日本设立生产线。截至今年3月,在日本设厂的中国内地及香港厂商已达49家,是5年前的一倍。  香港《经济日报》网站8月30日援引美国《华尔街日报》报道称,一家专门生产牙刷的上海企业于大坂设厂,并把产品销售至内地。该公司执行总监Wang Lin指出,中国人生活水平提升,消费者追求更好的产品,而内地人一向对日本产品印象良好。该公司以前于内地生产其他廉价牙刷品牌,但之后认为能向中国消费者出售较高级的产品,故萌生于日本设厂的念头。  报道称,该公司目前每月出口5万套牙刷到中国,每支售价为5美元,产品包装上印有日文,并贴有中文翻译。他认为,在日本设厂的成本虽然较高,但产品会是货真价实的日本货。  此外,也有日本企业回流当地设厂。  报道称,日本化妆品企业资生堂早年因日本国内销售下降,以致公司减低产能,由2004年6家日本工厂减至2015年的3家,但目前正重新在当地增建2家工厂,是1983年以来首次,这是为了满足中国及其他地区的强劲需求及日本销售复苏。责任编辑:余鹏飞 \n";
        Result word = ToAnalysis.parse(str);//分词结果的一个封装,主要是一个List<Term>的terms
        System.out.println(word.getTerms());

        List<Term> terms = word.getTerms(); //拿到terms
        System.out.println(terms.size());

        for(int i=0; i<terms.size(); i++) {
            String term = terms.get(i).getName(); //拿到词
            String natureStr = terms.get(i).getNatureStr(); //拿到词性

            System.out.println(term + ":" + terms.get(i).getSynonyms());

        }
    }
}

打包成 hlta.jar

python 调用代码

import jpype
from jpype import *
import os

# 获取jvm路径
jvmPath = jpype.getDefaultJVMPath()
# jvmPath = "D:/Java/jre1.8.0_151/bin/server/jvm.dll"

#动态加载jar包
libPath = "hlta"
lib_jar=['HLTA.jar', 'HLTA-deps.jar']
lib_jar = [ os.path.join(libPath,x) for x in lib_jar]

jvmArg = "-Djava.class.path="+";".join(lib_jar)
print(jvmArg)

#启动jvm
if not jpype.isJVMStarted():
    jpype.startJVM(jvmPath, jvmArg)

#python 执行java代码
jpype.java.lang.System.out.println("helloworld!")

#获取java类。这个是以jar包中的相对路径来找到
JDClass = jpype.JClass("jt")
#这里的有网上说是jd = JDClass()。问题来了,加上括号,在执行函数时可能会失败
jd = JDClass
jd.run()
print( jd.formatDuring(555555) ) 
# main函数的参数是一个list
jd.main(['a'])

到此这篇关于Python实现调用jar或执行java代码的方法详解的文章就介绍到这了,更多相关Python调用jar内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。