导出含第三方依赖的Jar包并在Python中调用
最近工作需要,导出含第三方依赖的Jar包,并在Python中调用。网上有的帖子误导人,特地写一篇blog记录一下坑点
默认情况下,使用MAVEN打包,打包出的Jar包是不包含第三方依赖的,如果想正常运行第三方依赖,需要把第三方包放在和本包同目录下或对应的目录下。
导出的Jar包位置可以直接看到
用WINRAR等软件打开jar包,底下META-INF\MANIFEST.MF
里面会存需要的Jar的class-path位置。
非MAVEN项目,需要在Project→Structure里编辑这个MANIFEST.MF
的class-path,并且指定主类。
还可以设置打入哪些包。
MAVEN项目,可以在POM中更改,需要引入打包插件。
1 | <build> |
jar-with-dependencies
表示包含依赖。导入插件后,点assembly:assembly
就可以打出带依赖的JAR
网上传的方法需要改打包的Jar中的参数,实际测试发现不用改,如果改了的话,导出的Jar里面会包含Jar,而这样的Jar 是无法被识别的。
正确打法:依赖变成Class了
错误打法:Jar中有Jar,不管放在哪个目录下都提示找不到依赖里面的类
P.S: 仔细思考,Jar(罐子)中应该有Bean(豆子)呀,怎么能有Jar呢?
另外,如果不把第三方包打入Jar,就把这些外部jar放和这个jar同目录下,并且修改MANIFEST.MF 就可以了。
在Python中调用打好的Jar
使用Jpype即可.
开启一个JVM实例,并且打开Jar
1 | jvmPath = jpype.getDefaultJVMPath() |
需要注意的是Jpype没有自动装箱拆箱功能,所以调用jar 略显僵硬。
1 | xxxClass = jpype.JClass("***.conf.***Config") |
像数组,如果是Integer [] 的 就得写成
[java.lang.Integer(0), java.lang.Integer(1)]
使用枚举类,先声明一下即可。
arrowClass = jpype.JClass("***.enums.ArrowType")
arrowClass.s
PS: hexo 识别图片:
需要安装插件,请参考https://www.jianshu.com/p/f72aaad7b852