认识JPype
- JPype是用于在python中调用java程序而诞生的,可以使得在python中使用java。它是一个python模块。
- JPype是python和java之间的桥梁,理论上的目标是,使得python可以访问java程序中所有公开的特性。即在java中能访问的,python通过JPype桥梁也可以访问。
- JPype通过控制JVM来控制java程序,值得关注的是JVM和python在同一个进程,可以理解为两个子线程共享相同的内存空间和线程。在python崩溃的时候JVM也会自动崩溃。
- 对python用户来说,大多时候不用关心JVM,仅仅需要操作的是启动和关闭JVM。在python所在进程的生命周期内,不可以重启JVM。即关闭JVM后再启动JVM会遇到错误。
安装JPype
建议的方式:pip install JPype1
启动JVM
- API:
jpype.startJVM( *args , **kwargs )
第一种方式:
不指定任何参数启动。
if __name__ == "__main__":
jpype.startJVM()
java.lang.System.out.println("hello world!")
"D:\Program Files\Python39\python.exe" D:/myProjects/python/test_JPype/main.py
hello world!
如果没有指定参数,它将使用默认的类路径和 jvmpath 启动 JVM。
默认类路径为jpype.getClassPath().
默认 jvmpath为jpype.getDefaultJVMPath().
if __name__ == "__main__":
print("默认类路径:"+jpype.getClassPath())
print("默认JVM:"+jpype.getDefaultJVMPath())
默认类路径:.;D:\Program Files\Java\jdk-16.0.2\lib
默认JVM: D:\Program Files\Java\jdk-16.0.2\bin\server\jvm.dll
默认路径与您的JDK安装路径有关。
默认类路径包含当前路径与JDK的lib目录。
第二种方式
指定参数启动。
1、如果你不想使用默认的jvm.dll
jpype.startJVM(jvmpath="You specify the jvm path")
2、 如果你想启动时加载一个jar包
jpype.startJVM("-Djava.class.path={}".format("your jar path")) # jpype.startJVM("-Djava.class.path={}".format(r"D:\myProjects\java\test1\out\artifacts\test1_jar\test1.jar"))
jpype.startJVM(classpath=r"D:\myProjects\java\test1\out\artifacts\test1_jar\test1.jar")
3、 如果你想启动时加载多个jar包
jpype.startJVM(classpath=[r"D:\test_1\test1.jar",r"D:\test_2\test2.jar"])
4、 如果想启动时加载一个目录下所有jar包
jpype.startJVM(classpath=[r"D:\test_1\*"])
5、如果你想启动时加载多个目录下所有jar包
jpype.startJVM(classpath=[r"D:\test_1\*",r"D:\test_2\*"])
JVM启动后还需要加载jar包怎么办
在jvm启动后,如果还有jar包没有在类路径里包含,可以使用jpype.addClassPath
这个api来完成增加jar包。
addClassPath(r"D:\test_1\test1.jar")
addClassPath(r"D:\test_1\*")
这个API会判断jvm是否启动:
如果jvm已经启动了,则将jar包路径增加到classLoader。
如果没有启动,则将jar包路径增加到_CLASSPATHS,然后启动jvm时加载这个jar包,这种方式与在启动时指定jar包类路径是相似的。
总结
这篇文章简单描述JPype的含义以及安装方式,然后介绍了JPype的启动,以及在启动时加载jar包和启动后加载jar包的方法。