导出含第三方依赖的Jar包并在Python中调用

导出含第三方依赖的Jar包并在Python中调用

​ 最近工作需要,导出含第三方依赖的Jar包,并在Python中调用。网上有的帖子误导人,特地写一篇blog记录一下坑点

​ 默认情况下,使用MAVEN打包,打包出的Jar包是不包含第三方依赖的,如果想正常运行第三方依赖,需要把第三方包放在和本包同目录下或对应的目录下。

image-20210828160241035

导出的Jar包位置可以直接看到

image-20210828160335182

用WINRAR等软件打开jar包,底下META-INF\MANIFEST.MF里面会存需要的Jar的class-path位置。

非MAVEN项目,需要在Project→Structure里编辑这个MANIFEST.MF的class-path,并且指定主类。

image-20210828160853376

还可以设置打入哪些包。

MAVEN项目,可以在POM中更改,需要引入打包插件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<!--这部分可有可无,加上的话则直接生成可在CMD中运行jar包-->
<archive>
<manifest>
<mainClass>com.runsstudio.SpringBootTest</mainClass>
<addClasspath>true</addClasspath> <!-- 是否要把第三方jar放到manifest的classpath中 -->
<!-- <classpathPrefix>.</classpathPrefix> &lt;!&ndash; 生成的manifest中classpath的前缀,因为要把第三方jar放到lib目录下,所以classpath的前缀是lib/ &ndash;&gt;-->
</manifest>
<!-- <manifestEntries>-->
<!-- <Class-Path>.</Class-Path>-->
<!-- </manifestEntries>-->
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>

</configuration>

</plugin>

</plugins>
</build>

jar-with-dependencies表示包含依赖。导入插件后,点assembly:assembly

image-20210828161140538

就可以打出带依赖的JAR

网上传的方法需要改打包的Jar中的参数,实际测试发现不用改,如果改了的话,导出的Jar里面会包含Jar,而这样的Jar 是无法被识别的。

正确打法:依赖变成Class了

image-20210828161403960

错误打法:Jar中有Jar,不管放在哪个目录下都提示找不到依赖里面的类

image-20210828161546528

P.S: 仔细思考,Jar(罐子)中应该有Bean(豆子)呀,怎么能有Jar呢?

另外,如果不把第三方包打入Jar,就把这些外部jar放和这个jar同目录下,并且修改MANIFEST.MF 就可以了。

在Python中调用打好的Jar

使用Jpype即可.

开启一个JVM实例,并且打开Jar

1
2
3
4
5
6
7
jvmPath = jpype.getDefaultJVMPath()
print(jvmPath)
# 加载刚才打包的jar文件
jarpath = os.path.join(os.path.abspath("."),
"'your dir'\\xxx.jar")
print(jarpath)

需要注意的是Jpype没有自动装箱拆箱功能,所以调用jar 略显僵硬。

1
2
3
xxxClass = jpype.JClass("***.conf.***Config")
xxxConf = xxxClass(java.lang.Integer(5), java.lang.Integer(3), java.lang.Integer(1),
java.lang.Integer(3))

像数组,如果是Integer [] 的 就得写成

[java.lang.Integer(0), java.lang.Integer(1)]

使用枚举类,先声明一下即可。

arrowClass = jpype.JClass("***.enums.ArrowType")

arrowClass.s

PS: hexo 识别图片:

需要安装插件,请参考https://www.jianshu.com/p/f72aaad7b852

-------------文章已结束~感谢您的阅读-------------
穷且益坚,不堕青云之志。