欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何在Python中调用打包好的Jar文件?

程序员文章站 2022-05-23 11:05:29
getDefaultJVM()报错、JClass()去找其中的一个类,提示我没有这个类、如何用IDEA打包我自己的项目代码?Python中调用Java代码出现中文乱码 ......

  首先是在anaconda中进入我这个项目对应的一个环境,然后在这个环境中下载并且安装jpype。那么就可以直接import了。但是这里出现了一系列的问题
  第一个问题,getdefaultjvm()报错,报的错是找不到默认的jvm,提示我配置好java_home
在配置好java_home之后,再次试了一下,就还是提示了一下找不到jvm,让我继续配置java_home,这里我重启了一下pycharm,然后提示了我下一个问题
  第二个问题,python是64位的而我jvm是32位的
我刚开始还不信,于是在网上查了一下,cmd中java -version如果版本中有出现64-bit的字样,那么就说明是64位的,反之则没有,我试了一下,我的果然没有64位字样,说明我的是32位的。接下来就是重装java,记得要首先在环境变量中将我们之前配置的环境变量删除,这个时候可以用个文本文件保存一下,等会儿重装的时候还要配置。删除了环境变量之后再用软件管家卸载java,这里有两个东西,都卸载掉。然后到官网下载,官网上找到windows,有x86和x64的,x86是32位的,下载x64位的jdk,记住一定是安装jdk而不是jre。安装之后配置一下环境变量,配置之后如果在cmd中输入java -version 和javac都出现提示信息说明配置成功。这一个问题算是解决了,下一个问题。
  我测试了一下我打包的项目文件,我用jclass()去找其中的一个类,提示我没有这个类
这个时候我去找了一下很多博客,都不是我这个问题,还有的人说我这个版本不行,说什么jpype不支持jdk1.6以上的,我差点就要放弃了,因为我不会为了这个版本而丢弃1.8,这太蠢了吧。但是后来我尝试了一下用别人的步骤先搭了一个简单的包,而且用cmd javac编译了一个类,并且用jar cvf myjar.jar com打包了这个项目,在python中找到了相应的类,是个jclass类,而且并成功实例化了该类。如果cmd不编译该类,则不能实例化。后面尝试了用idea打包,也是可以实例化并执行的。所以问题又来了
  如何用idea打包我自己的项目代码?
之前提到用jclass去找类的时候提示没有找到这个类,我觉得很奇怪,于是先解压我的jar包,发现它不是第一层目录,里面还有一些杂七杂八的东西,里面还有一个jar包,再次解开这个jar包,才发现是我想要的东西。于是把他引入到我的python项目中,这下成功找到了那个类,而且可以实例化并成功调用相关的方法。这里有个小坑就是,在我们创建artifacts的时候,如果从from mudule with dependencies这个方式创建,那么会创建一个之前说到的那个里面还有很多杂七杂八的东西的jar包,就是说,外层多了一层,而我们实际需要的东西,在整个jar包内部的下一层。所以正确的做法是先创建一个empty的artifact,然后从中添加mudule output,这样子就可以了
  这个时候我跑了一下我的项目,发现出现了中文乱码
这个中文乱码是在python调用java某个方法,而这个方法是输出中文,的时候,出现的。
我以为是编码的问题,所以就把两边的file encoding都改成了utf-8。但是调用的时候,还是出现了乱码。而如果用cmd执行jar包,是不会出现乱码的,而且python控制台直接输出中文也是正常的,但是在python的控制台用java的输出,就会出错。而如果java的方法返回一个字符串,在python这边输出,确是很正常的,这就说明。其实jar包并没有乱码的问题,有问题的是,jvm的输出在python这边的虚拟机上出现了乱码,这里猜测是更底层的实现细节,这里没有具体去深究。目前的解决方法就是,不在java中进行输出,统一在python中输出。但是还有个问题
  为什么java代码是先输出了之后才是python输出?明明部分python代码在前面啊?还未搞清楚