出现问题的具体环境
进行项目开发时需要使用sm2对一个字符串变量进行签名,并把签名后的变量交给另一个项目进行验签。两个项目的开发语言不同,一个是c#,另一个是java,c#使用java的项目的开发人员提供的私钥时会报错,解决报错问题后又会发生java项目验签失败的情况。
解决方式
通过在网上查找过各种各样的c#关于sm2的签名代码后,最终放弃使用用c#写的包,另辟蹊径,将java的包转换为c#的库进行使用。接下来是解决方法的详细步骤:
配置环境
配置java环境
下载网址:https://www.oracle.com/java/technologies/downloads/#java8-windows
下载的页面刚开始是java最新的几个版本,需要往下拉找到java8这个版本,根据自己的系统进行选择下载安装文件,下载完后就是进行安装(一直点下一步)
安装完后就需要进行环境变量的配置
java用于包管理的maven也是相同的操作
不过maven中conf文件夹下的settings.xml文件还需要进行编辑,这样下载maven插件和从maven仓库下载第三方包的速度就会变快
使用maven将需要的java包进行打包
下载idea, 网址:https://www.jetbrains.com/zh-cn/idea/download/?section=windows,第一次打开idea创建项目后会提示安装中文的IDE插件,需要的话可以安装
创建maven项目
将项目的maven配置文件换成自己的
接下来就是修改项目中的pom.xml文件来添加第三方jar包和一些maven插件
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>org.example</groupId>
<artifactId>hebing</artifactId>
<version>1.0-SNAPSHOT</version>
<!--第三方jar包-->
<dependencies>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.69</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>5.7.16</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-crypto</artifactId>
<version>5.7.16</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<!-- 其他插件配置 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version> <!-- 使用最新版本 -->
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.yourcompany.MainClass</mainClass>
</transformer>
</transformers>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Pom.xml中jar依赖的部分可以直接复制粘贴,maven仓库地址:https://mvnrepository.com/
搜索需要的包
找到后选择需要的版本
可以直接复制框选的部分,也可以直接下载jar包后再手动导入
Pom.xml文件编辑好后需要到右侧部分进行刷新,就会下载需要的依赖包和插件,idea的底部右侧会有进度条
全部完成后会可以将所有需要的jar包进行打成一个jar包了
打好包后就会在target文件夹中生成打好的jar包
在.net项目中使用jar包,通过c#调用java的类或函数
添加ikvm包
首先需要在项目中使用nuget添加ikvm包,提醒:不要使用ikvm-maven这个包,虽然ikvm的maven包可以自动下载maven仓库中的jar包,但是下载完后在执行项目时会出现因为依赖问题而找不到类的异常:
因为使用ikvm的maven包下载jar包后会对单个jar进行编译,编译后jar包中的依赖就会找不到包。
.net中的nuget下载包后打包成dll文件时会将这个包用到的依赖一起打包成一个文件,但是java不会,java只会打包这个包的作者自己写的,包中不会有依赖的包的代码。所以之前java打包的部分需要将所有需要的包打成一个jar包,是为了防止jar包中的代码找不到依赖的代码
项目中添加jar包
在项目中创建名称为jar的文件夹,并把之前打的jar包复制到这个文件夹中
编辑项目的.csproj文件
<ItemGroup>
<IkvmReference Include="jar/jar包名.jar" />
</ItemGroup>
修改完后重新构建项目,最后就可以直接在代码中使用java的函数和类了
使用实例: