1、目标
解决java组件依赖的问题:将依赖java实现的程序封装后,打成可执行的jar包,再通过python3执行调用即可。
2、核心步骤
1)选择合适的框架,如maven,并引入依赖包(pom.xml)
2)封装主程序后,通过ieda快捷打包(包含所依赖的包)
3)python3调用jar包
3、实现过程
3.1 maven项目打jar包
1)创建maven项目
2)主程序代码-demo如下
- JarMain.java
package com.huawei.controller;
import com.huawei.server.TestJar;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.HashMap;
public class JarMain {
public static void main(String[] args) throws Exception{
HashMap<String, ArrayList<String>> apiInfo = new HashMap<String, ArrayList<String>>();
ArrayList<String> bookList = TestJar.getBookList();
apiInfo.put("bookList", bookList);
// System.out.println(apiInfo); // {bookList=[三国志, 西游记]}
String jsonApiInfo = JSON.toJSONString(apiInfo); // hashMap 转 json
System.out.println(jsonApiInfo); // {"bookList":["三国志","西游记"]}
}
}
- TestJar.java
package com.huawei.server;
import java.util.ArrayList;
public class TestJar {
public static ArrayList<String> getBookList() throws Exception{
ArrayList<String> bookList = new ArrayList<String>();
bookList.add("三国志");
bookList.add("西游记");
return bookList;
}
}
3)pom文件指定组件及依赖进行打包
- pom文件中指定 main类名及依赖包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.huawei</groupId>
<artifactId>test-maven-jar</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.5</version>
<configuration>
<archive>
<manifest>
<!-- 这里配置你的程序入口main -->
<mainClass>com.huawei.controller.JarMain</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
- 通过idea的maven快捷键 生成 jar包
mvn clean compile assembly:single
- 生成的jar包,在 target目录下
- 终端命令可直接运行
java -jar test-maven-jar-1.0-SNAPSHOT-jar-with-dependencies.jar
3.2 python3调用jar包
- 方法1:
import ast
import subprocess
class ReadJar(object):
def __init__(self, jar_path):
self.jar_path = jar_path
def query_jar(self):
execute = "java -jar {}".format(self.jar_path)
output = subprocess.Popen(execute, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
encoding="utf-8")
res = output.stdout.readlines()
return ast.literal_eval(res)
if __name__ == '__main__':
rj = ReadJar("test-maven-jar-1.0-SNAPSHOT-jar-with-dependencies.jar")
rj.query_jar()
- 方法2:
import jpype
class ReadJar(object):
def __init__(self, jar_path):
self.jar_path = jar_path
self.jvm_path = jpype.getDefaultJVMPath()
def query_jar(self):
jpype.startJVM(self.jvm_path, "ea", "-Djava.class.path=%s" % self.jar_path, convertStrings=True)
TestJar = jpype.JClass("com.huawei.server.TestJar")
book_list = TestJar.getBookList()
print(book_list)
return book_list
if __name__ == '__main__':
dj = ReadJar("./test-maven-jar-1.0-SNAPSHOT-jar-with-dependencies.jar")
dj.query_jar()