Zwei JAR-Pakete stehen in Konflikt, aber beide Lösungen müssen verwendet werden, dh die höhere Version ist nicht mit der niedrigeren Version kompatibel
-
- Lösung 1 verwendet URLClassLoader, um das JAR-Paket zu laden, sodass es vom in Konflikt stehenden JAR-Paket isoliert wird.
- 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
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
- Dekompilieren Sie mit Tools wie jd-gui (ein Teil der dekompilierten Dekompilierung enthält Fehler, die gemäß der Logik korrigiert werden müssen)
- Verwenden Sie IDEA, um ein neues Projekt zu erstellen (beachten Sie, dass es in Ihren eigenen Paketnamen geändert wird
- Fügen Sie den dekompilierten Quellcode in das Projekt ein
- Führen Sie eine Testumverpackung durch
- Projekt importieren
Freunde, wenn Sie eine bessere Lösung haben, hinterlassen Sie bitte eine Nachricht und lassen Sie es mich wissen, danke!