美文网首页
python中调用jar包

python中调用jar包

作者: 逍遥_yjz | 来源:发表于2021-09-24 15:17 被阅读0次

在本文中,首先创建一个maven项目,然后打包成jar包,在python中调用jar包,执行java类方法。
IDEA作为最好得开发工具之一集成了maven工具,今天记录一下我创建使用idea创建maven项目。

1. IDEA创建maven项目

1.双击IDEA图标,进入到如下界面,在该页面中,点击箭头所示的“Create New Project”选项;



2.选择maven选项,选择JDK版本,勾选图示所示的“Create From Archetype”复选框,选择maven模板,点击【Next】



在此我选择JDK 1.8,创建maven项目

3.写maven的坐标,“groupId”,“artifactId”,以及“version”,其中groupId是公司域名的反写,而artifactId是项目名或模块名,version就是该项目或模块所对应的版本号,填写完之后,点击【Next】



4.选择本地的maven,选择maven得配置文件路径及本地maven仓库路径,选择完成后点击【Next】



5.填写项目名,后点击【Finish】
6.会maven的主页面,maven会自动下载maven依赖,当所有的都自动完成后,创建的maven项目结构如下所示:

到此为止,maven项目的框架搭建好啦,剩余就填充代码

2. 编写程序

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



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

<?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.rfchina</groupId>
  <artifactId>utils</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>utils</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <!--
   <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.11</version>
     <scope>test</scope>
   </dependency>
     -->
   <dependency>
     <groupId>commons-codec</groupId>
     <artifactId>commons-codec</artifactId>
     <version>1.11</version>
   </dependency>
 </dependencies>

 <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>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>

        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>2.2</version>
          <configuration>
            <archive>
              <manifest>
                <!-- 我运行这个jar所运行的主类 ,但是我的实际是com.rfchina.RsaSign,
                    访问的时候,还是实际代码类的路径com.rfchina.RsaSign,我也搞不明白这里的写的
                    不统一,有啥用。打包命令:mvn package -Dmaven.test.skip=true assembly:single
                -->
                <mainClass>com.rfchina.RsaSign</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>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

2.3 编写java代码前,这里我们先安装一下依赖包:
第一种方法:
右键点击pom.xml文件–>maven–>reload project,若不行,看第二种方法。


第二种方法:
需要使用国内的Maven类库,IDEA的Maven类库默认都是使用国外的,一些地区由于墙的原因加载会很慢或者加载不了,此时可以导入阿里云的 Maven 类库:
pom.xml 中添加:
<repositories>
        <repository>
            <id>aliyunmaven</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        </repository>
</repositories>

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



2.4 开始编写java代码
Base64Utils.java

package com.rfchina;
import org.apache.commons.codec.binary.Base64;
public class Base64Utils {
    /**
     * 使用Base64加密字符串
     * @return 加密之后的字符串
     * @exception Exception
     */
    public static String encode(byte[] data){
        Base64 base64 = new Base64();
        String encodedData = base64.encodeAsString(data);
        return encodedData;
    }
    /**
     * 使用Base64解密
     * @return 解密之后的字符串
     * @exception Exception
     */
    public static byte[] decode(String data){
        Base64 base64 = new Base64();
        byte[] decodedData = base64.decodeBase64(data);
        return decodedData;
    }
}

RsaSign.java

package com.rfchina;

import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
public class RsaSign {
    private static final String SIGNATURE_ALGORITHM = "SHA256withRSA";
    private static final String KEYPAIR_GENERATOR_ALGORITHM = "RSA";
    // 商户私钥加密接口请求参数
    final String privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAMJSignj27blOez6i6YCM1b4AC9CtgubD0B9gmTskENJNxzg9i59hCpIibkTg1rvMDdSuKFvlHtxkOgSID8Qgm1h3AxpMKpYT58FnApqY7img85xEZo+uNB1GHTbrhuCGQFf2P8U1hE01Y6miFsESsFTQ09BpNy+1wPKt/KbW75fAgMBAAECgYA/04iPkw4Z1tTd57Vyw4pFaJP28fyFd1rdHdx0ddc0opm9nI5/2q5MjSLfbW9ZsPKvWTZXoCSvHzAvabS5whx0aYpZlfWCd6QRNAuoaP0FSCWH/ty7I3nHQJK8LQQhP3nfekAfiyMpvGGK4KrderEP37/MG1202iycR4X6fZnMkQJBAPqaKChFYAqStADg3owoux5Gc3rAf2zRXIBZXPNEYgE0owpwtP2tYPdcIy9l01Yv1nIDr2O7x8JrbUOuNe/4/4sCQQDGggz4XHqZAwDBvea3g9FBCnojzyqQMtHO54TxL6NXIr7maBoBb0XCXuh6Uz2F7O8an1Bi/adQXVXUhvErG9b9AkBJhU6AuhG6KF4M3+wKnKyA7lRU0ALSTv3fXdhKOmaySdoHZxeCUQpgp7Re5HXDFFfKrVAYZ2/slw3ATGzgkWGPAkBW5b1px4n/i3n8VfY2paSntT9sh5bZUvXXfjALKNB3J4Wr9SxVLnG6ObPJQMEw7FxrKgyVmPZyTrlw9LWEKoa9AkBz9OU/BFhg9wIcHiFWQSOQdKQ4touyTF3T3EbROt34oXEhp1b3/eEGlwvNF2dUrfi39b5rKph63G6d3rxb+GVG";

    public String rsa_sign(String encryData) {
//        String encryData_example="app_id=12996762&app_secret=902ac71d8fdbdfc097f53070afbcaefb&platform=1&sign_type=RSA&timestamp=1536032317";
        String sign = "";
        try {
            byte[] buffer = Base64Utils.decode(privateKey);
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);
            KeyFactory keyFactory = KeyFactory.getInstance(KEYPAIR_GENERATOR_ALGORITHM);
            PrivateKey prK = keyFactory.generatePrivate(keySpec);
            Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
            signature.initSign(prK);
            signature.update(encryData.getBytes());
            sign =  Base64Utils.encode(signature.sign());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return sign;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        RsaSign rs = new RsaSign();
        String encryData = "app_id=12996762&app_secret=902ac71d8fdbdfc097f53070afbcaefb&platform=1&sign_type=RSA&timestamp=1536032317";
        System.out.println(rs.rsa_sign(encryData));
    }

}

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

3. 打jar包

第一种方法:


如上图所示,第一步-->第二步,最后生成jar包如下图所示,但是没有将依赖包打进去,也尝试第二种方法也不行,但是在别人哪里可以,在此记录一下。

第二种方法:


这种方法对我来说也没用,最终我们成功案例方法,它来啦。
第三种方法:
使用打包命令:
mvn package -Dmaven.test.skip=true assembly:single

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


4. 在Python中调用 jar 包

将生成的jar包放入到


demo.py
import jpype


def get_rsa_sign(sign_raw):
    """
    调用java jar包,对入参进行rsa签名
    :param sign_raw:待签名字符串
    :return:signature:签名后的加密字符串
    """
    # 启动JVM
    jvmPath = jpype.getDefaultJVMPath()
    # 加载jar包
    # jpype.startJVM(jvmPath, "-ea", "-Djava.class.path=D:/jarPac/jin-1.0-SNAPSHOT-jar-with-dependencies.jar")
    # # 指定main class
    # JDClass = jpype.JClass("RsaSign")

    jpype.startJVM(jvmPath, "-ea", "-Djava.class.path=D:/jarPac/utils-1.1-SNAPSHOT-jar-with-dependencies.jar")
    # 指定main class
    JDClass = jpype.JClass("com.rfchina.RsaSign")
    # 创建类实例对象
    jd = JDClass()
    # 引用jar包类中的方法 rsa_sign
    signature = jd.rsa_sign(sign_raw)
    # 关闭JVM
    jpype.shutdownJVM()
    return signature


if __name__ == '__main__':
    sign_raw = "app_id=68613717&app_secret=039b8b6f1544f62dace6fe53e4c380be&platform=1&sign_type=RSA&timestamp=1536039464"
    print("rsa 签名结果:",get_rsa_sign(sign_raw))

运行结果如下:

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

相关文章

网友评论

      本文标题:python中调用jar包

      本文链接:https://www.haomeiwen.com/subject/lrrzgltx.html