栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

两个jar包冲突但两个都要使用的解决方案

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

两个jar包冲突但两个都要使用的解决方案

两个jar包冲突但两个都要使用的解决方案,也就是高版本不兼容低版本

方案一 使用URLClassLoader加载jar包这样就与冲突jar包隔离开了。方案二 可以去找到jar包的源码修改包名然后放在自己的工程里或在打个jar包引入项目方案三 如果找不到jar包源码那就反编译

方案一 使用URLClassLoader加载jar包这样就与冲突jar包隔离开了。

使用方法繁琐需要反射来调用方法。
适用于使用某个jar包少量方法的应用。

实现

import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.TreeMap;

public abstract class TestUtils {
	private static URLClassLoader clsLoader;
	private static Class haxClass;
	private static Class SM3DigestClass;

    static {
        //类加载器加载bcprov-jdk15on-1.60.jar
        try {
       		 //加载bcprov-jdk15on-1.60.jar包,放在了src下
			clsLoader = URLClassLoader.newInstance(new URL[] {new URL(TestUtils .class.getResource("/")+"bcprov-jdk15on-1.60.jar")});
			//加载需要使用的类(包名称加上类名)
			SM3DigestClass = clsLoader.loadClass("org.bouncycastle.crypto.digests.SM3Digest");
        	haxClass = clsLoader.loadClass("org.bouncycastle.util.encoders.Hex");
        	log.info("bcprov-jdk15on-1.60.jar被加载了!");
		} catch (Exception e) {
			log.error("bcprov-jdk15on-1.60.jar加载失败!,原因:"+e.getMessage());
		}
    }
    
    
    
	  public static String sM3encode(String source) {
	        try {
		    	byte[] md = new byte[32];
		    	byte[] msg = source.getBytes("UTF-8");
		    	//实例化对象
		        Object sM3DigestObject=SM3DigestClass.newInstance();
		        Object haxObject = haxClass.newInstance();
		        //调用需要调用的方法(通过反射)
				Method update =SM3DigestClass.getMethod("update", byte[].class,int.class,int.class);
				update.invoke(sM3DigestObject, msg, 0, msg.length);
				Method doFinal =SM3DigestClass.getMethod("doFinal", byte[].class,int.class);
				doFinal.invoke(sM3DigestObject, md, 0);
				Method encode =haxClass.getMethod("encode", byte[].class);
				byte[] haxEncodeString =(byte[])encode.invoke(haxObject, md);
		    	String s = new String(haxEncodeString);
		    	return s;
	        } catch (Exception e) {
	        	log.error("sM3encode编码错误!原因:"+e.getMessage());
	            return null;
	        }
	    }  
    
}
方案二 可以去找到jar包的源码修改包名然后放在自己的工程里或在打个jar包引入项目 方案三 如果找不到jar包源码那就反编译
    通过jd-gui等工具反编译(反编译的有部分存在错误的反编译,需要根据逻辑自行更正)使用IDEA新建工程(注意改为自己的包名将反编译后的源码放入工程中运行测试重新打包引入项目

小伙伴们,如果有更好方案请留言告诉我,谢谢!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/769294.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号