VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > 简明python教程 >
  • 如何在Python中调用打包好的Jar文件?

 首先是在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代码在前面啊?还未搞清楚

相关教程