在本文中,首先创建一个maven项目,然后打包成jar包,在python中调用jar包,执行java类方法。

1.在eclipse中创建maven项目

我这里创建一个普通java项目,择选择 “maven-archtype-quickstart” 即可

2.创建后,在项目根目录下会有一个pom.xml

3.编写pom文件,加载项目所需要的依赖,我的pom.xml 如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5.  
  6. <groupId>com.rfchina</groupId>
  7. <artifactId>utils</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. <packaging>jar</packaging>
  10.  
  11. <name>utils</name>
  12. <url>http://maven.apache.org</url>
  13.  
  14. <properties>
  15. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  16. </properties>
  17.  
  18. <dependencies>
  19. <!--
  20. <dependency>
  21. <groupId>junit</groupId>
  22. <artifactId>junit</artifactId>
  23. <version>3.8.1</version>
  24. <scope>test</scope>
  25. </dependency>
  26. -->
  27. <dependency>
  28. <groupId>commons-codec</groupId>
  29. <artifactId>commons-codec</artifactId>
  30. <version>1.11</version>
  31. </dependency>
  32.  
  33. </dependencies>
  34.  
  35. <!-- maven打包构建时,使用参数 assembly:assembly 则会加载依赖包 -->
  36. <build>
  37. <plugins>
  38. <plugin>
  39. <artifactId>maven-assembly-plugin</artifactId>
  40. <version>2.2</version>
  41. <configuration>
  42. <archive>
  43. <manifest>
  44. <!-- 我运行这个jar所运行的主类 -->
  45. <mainClass>com.rfchina.utils.RsaSign</mainClass>
  46. </manifest>
  47. </archive>
  48. <descriptorRefs>
  49. <descriptorRef>
  50. <!-- 必须是这样写 -->
  51. jar-with-dependencies
  52. </descriptorRef>
  53. </descriptorRefs>
  54. </configuration>
  55. </plugin>
  56. </plugins>
  57. </build>
  58. </project>

4.编写java代码前,这里我们先安装一下依赖包:

pom.xml 右键->Run As ->Maven Install

运行后,可以在Maven Dependencies中看到已经下载并且引入的maven依赖包

5.开始编写java代码

Base64Utils.java

  1. package com.rfchina.utils;
  2.  
  3. import org.apache.commons.codec.binary.Base64;
  4. public class Base64Utils
  5. {
  6. /**
  7. * 使用Base64加密字符串
  8. * @return 加密之后的字符串
  9. * @exception Exception
  10. */
  11. public static String encode(byte[] data){
  12. Base64 base64 = new Base64();
  13. String encodedData = base64.encodeAsString(data);
  14. return encodedData;
  15. }
  16. /**
  17. * 使用Base64解密
  18. * @return 解密之后的字符串
  19. * @exception Exception
  20. */
  21. public static byte[] decode(String data){
  22. Base64 base64 = new Base64();
  23. byte[] decodedData = base64.decodeBase64(data);
  24. return decodedData;
  25. }
  26. }

RsaSign.java

  1. package com.rfchina.utils;
  2.  
  3. import java.security.KeyFactory;
  4. import java.security.PrivateKey;
  5. import java.security.Signature;
  6. import java.security.spec.PKCS8EncodedKeySpec;
  7.  
  8. /**
  9. * @ClassName: RsaSign
  10. * @Description: RSA 私钥签名
  11. * @author Milton
  12. * @date 2018年9月4日
  13. *
  14. */
  15. public class RsaSign {
  16. private static final String SIGNATURE_ALGORITHM = "SHA256withRSA";
  17. private static final String KEYPAIR_GENERATOR_ALGORITHM = "RSA";
  18. // 商户私钥加密接口请求参数
  19. final String privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAMJSignj27blOez6i6YCM1b4AC9CtgubD0B9gmTskENJNxzg9i59hCpIibkTg1rvMDdSuKFvlHtxkOgSID8Qgm1h3AxpMKpYT58FnApqY7img85xEZo+uNB1GHTbrhuCGQFf2P8U1hE01Y6miFsESsFTQ09BpNy+1wPKt/KbW75fAgMBAAECgYA/04iPkw4Z1tTd57Vyw4pFaJP28fyFd1rdHdx0ddc0opm9nI5/2q5MjSLfbW9ZsPKvWTZXoCSvHzAvabS5whx0aYpZlfWCd6QRNAuoaP0FSCWH/ty7I3nHQJK8LQQhP3nfekAfiyMpvGGK4KrderEP37/MG1202iycR4X6fZnMkQJBAPqaKChFYAqStADg3owoux5Gc3rAf2zRXIBZXPNEYgE0owpwtP2tYPdcIy9l01Yv1nIDr2O7x8JrbUOuNe/4/4sCQQDGggz4XHqZAwDBvea3g9FBCnojzyqQMtHO54TxL6NXIr7maBoBb0XCXuh6Uz2F7O8an1Bi/adQXVXUhvErG9b9AkBJhU6AuhG6KF4M3+wKnKyA7lRU0ALSTv3fXdhKOmaySdoHZxeCUQpgp7Re5HXDFFfKrVAYZ2/slw3ATGzgkWGPAkBW5b1px4n/i3n8VfY2paSntT9sh5bZUvXXfjALKNB3J4Wr9SxVLnG6ObPJQMEw7FxrKgyVmPZyTrlw9LWEKoa9AkBz9OU/BFhg9wIcHiFWQSOQdKQ4touyTF3T3EbROt34oXEhp1b3/eEGlwvNF2dUrfi39b5rKph63G6d3rxb+GVG";
  20.  
  21. public String rsa_sign(String encryData) {
  22. // String encryData_example="app_id=12996762&app_secret=902ac71d8fdbdfc097f53070afbcaefb&platform=1&sign_type=RSA&timestamp=1536032317";
  23. String sign = "";
  24. try {
  25. byte[] buffer = Base64Utils.decode(privateKey);
  26. PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);
  27. KeyFactory keyFactory = KeyFactory.getInstance(KEYPAIR_GENERATOR_ALGORITHM);
  28. PrivateKey prK = keyFactory.generatePrivate(keySpec);
  29. Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
  30. signature.initSign(prK);
  31. signature.update(encryData.getBytes());
  32. sign = Base64Utils.encode(signature.sign());
  33. } catch (Exception e) {
  34. // TODO Auto-generated catch block
  35. e.printStackTrace();
  36. }
  37. return sign;
  38. }
  39.  
  40. public static void main(String[] args) {
  41. // TODO Auto-generated method stub
  42.  
  43. RsaSign rs = new RsaSign();
  44. String encryData = "app_id=12996762&app_secret=902ac71d8fdbdfc097f53070afbcaefb&platform=1&sign_type=RSA&timestamp=1536032317";
  45. System.out.println(rs.rsa_sign(encryData));
  46.  
  47. }
  48. }

其中RsaSign是我主要想要调用的工具类。

6.打包即可,这里注意,打包时需要将maven依赖包“commons-code-1.11.jar”也打进来,顾需要通过插件“maven-assembly-plugin”,前面已经加入在pom中了。

pom.xml-》右键-》Run AS -》Maven Build...-》指定Goals参数:assembly:assembly -》Run

7.打包成功后,在target目录下可以得到需要的jar包,如

8.将jar包放到python项目下,下面我们开始编写python代码,进行jar包的引用

jar_utils.py

  1. import jpype
  2.  
  3. def get_rsa_sign(sign_raw):
  4. """
  5. 调用java jar包,对入参进行rsa签名
  6. :param sign_raw:待签名字符串
  7. :return:signature:签名后的加密字符串
  8. """
  9. # 启动JVM
  10. jvmPath = jpype.getDefaultJVMPath()
  11. # 加载jar包
  12. jpype.startJVM(jvmPath, "-ea", "-Djava.class.path=utils-0.0.1-SNAPSHOT-jar-with-dependencies.jar")
  13. # 指定main class
  14. JDClass = jpype.JClass("com.rfchina.utils.RsaSign")
  15. # 创建类实例对象
  16. jd = JDClass()
  17. # 引用jar包类中的方法 rsa_sign
  18. signature = jd.rsa_sign(sign_raw)
  19. # 关闭JVM
  20. jpype.shutdownJVM()
  21. return signature
  22.  
  23. if __name__ == '__main__':
  24. sign_raw = "app_id=68613717&app_secret=039b8b6f1544f62dace6fe53e4c380be&platform=1&sign_type=RSA&timestamp=1536039464"
  25. print("rsa 签名结果:",get_rsa_sign(sign_raw))

运行结果如下:

  1. JVM has been shutdown
  2. rsa 签名结果: Z8OqE9ldgp7+gG6+fFm/N17pqQAIvGzQY7VztYzWgsSEYiyi7g9piHPIZqB22ekRZfzPFpOXM0lXc+GDjZWYwN+0XJGvJYQMWDGuTgHcf8c6VhiiOgUHXtptHG4Op+06v3SJ1iNaEy8F5tH9Y74X6GhTqR28SHuW3sdep1AhExY=

***微信扫一扫,关注“python测试开发圈”,了解更多测试教程!***

在python中引用jar包的更多相关文章

  1. 【Gradle】配置中引用的jar包版本后面自动加冒号导致引入jar包失败的问题/gradle中引用jar包版本不一致的问题/gradle中引用jar失败的问题 解决方法

    idea中 gradle中 引用jar包,版本后面默认加:的问题 gradle中引用jar包版本不一致的问题 gradle中引用jar失败的问题 如上题目所示,三个问题其实都是同一样的简单又恶心,因为 ...

  2. Xamarin Android中引用Jar包的方法

    新建一个Java Bingdings Library 将Jar包复制,或使用添加已存在的文件,到Jars文件夹中 确认属性中的“生成操作” 如果有类型转换不正确,请修改Transforms文件夹中的相 ...

  3. html或者jsp页面引用jar包中的js文件

    一,页面上引用jar包中的js文件的方法 使用java web框架AppFuse的时候发现,jquery.bootstrap等js框架都封装到jar包里面了.这些js文件通过一个wro4j的工具对其进 ...

  4. idea无法引用jar包中的class

    最近由eclipse换idea的过程中,出现了一个很奇妙的问题! 项目是maven+git+idea管理的,idea某次在使用的过程中,电脑死机重启后,发现无法引用jar包中的class.包括jdk中 ...

  5. Python一键转Jar包,Java调用Python新姿势!

    粉丝朋友们,不知道大家看故事看腻了没(要是没腻可一定留言告诉我^_^),今天这篇文章换换口味,正经的来写写技术文.言归正传,咱们开始吧! 本文结构: 需求背景 进击的Python Java和Pytho ...

  6. Android studio 中引用jar的其实是Maven?(二)

    上一篇:Android studio 中引用jar的其实是Maven?(一) 搭建maven仓库: 去了解一个新的事物的时候,最好的方式就是去使用它.例如去了解一座城市的时候,最好的方式就是乘坐公共交 ...

  7. Android studio 中引用jar的其实是Maven?(一)

    由于Studio比eclipse多了一步对工程构建的步骤,即为build.gradle这个文件运行,因此其引入第三方开发jar包与lib工程对比Eclipse已完成不同,引入第三方jar与lib工程显 ...

  8. Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图(转载)

    Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图 2017年04月05日 10:53:13 李学凯 阅读数:104997更多 所属专栏: Intellij Idea   ...

  9. 如何制作Jar包并在android中调用jar包

    android制作jar包: 新建android工程,然后右击,点击导出,选择导出类型为Java下的JAR file,在java file specification 中不要选择androidmani ...

随机推荐

  1. saml,sso

    saml,sso centos version get:// cat /etc/redhat-release

  2. 7.1 - CRM系统

    一.简介 crm 客户关系管理软件 ( Customer Relationship Management ) ( 详细内容 ) stark组件(仿admin组件)( 详细内容 ) rbac组件(基于角 ...

  3. python通过os.walk() 遍历出多级目录下所有文件绝对路径

    代码如下 将遍历出来的路径全部添加到列表中: def get_all_abs_path(source_dir): path_list = [] for fpathe, dirs, fs in os.w ...

  4. mysql join实现方式

    1. nested loop join 分别从两个表读一行数据进行两两对比,复杂度是n^2 2. block nested loop join 分别从两个表读很多行数据,然后进行两两对比,复杂度也是n ...

  5. Java 如何中断和恢复线程的执行

    一.线程的状态 线程可以阻塞于四种状态: 1.当线程执行Thread.sleep()时,它一直阻塞到指定的毫秒时间之后,或者阻塞被另一个线程打断: 2.当线程碰到一条wait()语句时,它会一直阻塞到 ...

  6. mysql 表的增删改查 修改表结构

    四.修改表结构 语法: . 修改表名 ALTER TABLE 表名 RENAME 新表名; . 增加字段 ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…], ADD 字段名 ...

  7. git-【四】撤销修改和删除文件操作

    一:撤销修改: 比如我现在在readme.txt文件里面增加一行 内容为555555555555,我们先通过命令查看如下: 在未提交之前,发现添加5555555555555内容有误,所以得马上恢复以前 ...

  8. 没的选择时,存在就是合理的::与李旭科书法字QQ聊天记录

    2015,8,11,晚上,与李旭科书法字作者,在Q上聊了下 有些资料 涉及到字库设计.字库产业,对大家也有益处 按惯例 没细整理,直接发blog了 ps,9.11 靠,今天是911,早上查资料,在 f ...

  9. Learning to Rank之RankNet算法简介

    排序一直是信息检索的核心问题之一, Learning to Rank(简称LTR)用机器学习的思想来解决排序问题(关于Learning to Rank的简介请见我的博文Learning to Rank ...

  10. Vue学习笔记之计算属性和侦听器

    0x00 计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div> {{ message.split(''). ...