需求描述
公司要求使用python对接口做自动化测试,接口的实现是Java,部分接口需要做加解密,因此需要使用python来调用jar包来将明文加密成密文,然后通过http请求访问接口进行测试。
如何实现
1.安装Jpype
首先我们需要安装Jpype库:
conda install -c conda-forge jpype1
2.使用maven带依赖打包项目
这里需要注意的是,虽然在接口的开发过程中,也是通过引入第三方的jar包完成的加解密,但是maven会帮我下载好jar包的依赖,因此我们仅仅是单独使用加解密的jar包大概率会报错,找不到依赖。
创建maven项目并在pom.xml中引入依赖:
然后使用maven构建项目,maven将会自动下载这些依赖以及这些jar包对应的依赖:
接着我们可以简单的编写代码,完成功能中转:
你也可以对功能进行自定义的封装。完成功能中转后,我们还需要继续对pom.xml文件做编写,加入一下内容:
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2</version>
<configuration>
<archive>
<manifest>
<mainClass>com.ayanokoujimonki.SM4UtilsForPython</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>
<!-- 必须是这样写 -->
jar-with-dependencies
</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
这些配置是要保证你在后续生成jar包时,能把依赖一起打包。上面配置中,需要注意两个点,首先是mainClass的设置,要把你的工具类暴露在这里,然后要告诉maven你要带依赖的生成jar包:
在这个过程中你也可能遇到plugin标签中的内容会报红:
这时你需要加上这个依赖:
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
<type>maven-plugin</type>
</dependency>
然后使用maven重新加载一下就行。
接下来我们可以将项目打包,首先使用maven的clean清除target目录(第一次应该不会有target目录,但是建议每次打包前都clean一下),然后使用package将项目打包:
这时,你的项目会多一个target目录,里面就会有一个jar包:
接着,我们进入到项目目录下,运行以下命令:
maven assembly:assembly
这时maven会帮我们带依赖打包jar包,最后会在target目录下生成对应的jar包:
这个就是我们想要的带依赖的jar包,接着就是使用Jpype调用jar包了。
3.使用Jpype调用jar包
import jpype
import jpype.imports
from jpype.types import *
# 调用方法需要的参数
secret_key = "xxxxxxx"
iv = "xxxxxxx"
body_str = 'xxxxxxx'
access_key = "xxxxxxx"
# 启动 JVM,这个会默认找你系统变量中配置的jdk版本对应的jvm,也可以自己指定
# 需要注意的是jdk17会对jar包签名进行认证,这样就就会加载jar包失败,建议手动指定为jdk1.8的jvm
jvmPath = jpype.getDefaultJVMPath()
# jvmPath = r"corretto-1.8.0_422\jre\bin\server\jvm.dll"
# 第一个参数为jvm的路径
# 第二个参数为jvm的参数,作用是jar包返回的字符串的编码为utf-8,不设置可能会导致中文乱码
# 第三个参数为jar包的路径
jpype.startJVM(jvmPath,
"-Dfile.encoding=UTF-8",
"-Djava.class.path=E:\PycharmProjects\damddos-autotest\sm4utils-1.0-SNAPSHOT-jar-with-dependencies.jar",
)
# 导入 Java 类
MyClass = jpype.JClass("com.ayanokoujimonki.SM4UtilsForPython")
# 创建 Java 类的实例
my_instance = MyClass()
# 调用 Java 方法
## sm4加密
body_sm4 = my_instance.sm4EncryptCbc(secret_key, body_str, iv)
print(body_sm4)
Jpype调用jar包还是很方便的,但是要注意jdk的版本。jdk17会校验jar包的签名,我们自己通过maven得到的jar包是没有签名的,而合法的签名也比较难搞定,最简单的方法是指定其他版本jdk的jvm路径,一般来说jdk1.8就够用了。