Zwei JAR-Pakete stehen in Konflikt, aber beide Lösungen müssen verwendet werden

Lösung 1 verwendet URLClassLoader, um das JAR-Paket zu laden, sodass es vom in Konflikt stehenden JAR-Paket isoliert wird.

Die Verwendung von Methoden ist umständlich und erfordert Reflexion, um Methoden aufzurufen.
Es eignet sich für Anwendungen, die eine kleine Anzahl von Methoden in einem bestimmten JAR-Paket verwenden.

erreichen

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());
		}
    }
    
    
    /**
     * 生成SM3编码
     * 由于bcprov-jdk15on-1.60.jar与bcprov-jdk16-139.jar冲突所以改用类加载器加载jar包并以反射调用方法
     * @param source
     * @return
     */
	  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;
	        }
	    }  
    
}

Lösung 2: Suchen Sie den Quellcode des JAR-Pakets, ändern Sie den Paketnamen und fügen Sie ihn in Ihr eigenes Projekt ein oder importieren Sie das Projekt in ein JAR-Paket

Lösung 3 Wenn Sie den Quellcode des JAR-Pakets nicht finden können, dann dekompilieren Sie es

  1. Dekompilieren Sie mit Tools wie jd-gui (ein Teil der dekompilierten Dekompilierung enthält Fehler, die gemäß der Logik korrigiert werden müssen)
  2. Verwenden Sie IDEA, um ein neues Projekt zu erstellen (beachten Sie, dass es in Ihren eigenen Paketnamen geändert wird
  3. Fügen Sie den dekompilierten Quellcode in das Projekt ein
  4. Führen Sie eine Testumverpackung durch
  5. Projekt importieren

Freunde, wenn Sie eine bessere Lösung haben, hinterlassen Sie bitte eine Nachricht und lassen Sie es mich wissen, danke!

Je suppose que tu aimes

Origine blog.csdn.net/shixiaodongmain/article/details/123517529
conseillé
Classement