gpt4 book ai didi

java - 如何在1个Java类中加载同一个Jar的2个版本

转载 作者:行者123 更新时间:2023-12-02 08:00:22 25 4
gpt4 key购买 nike

这是一个复杂的问题,但我会尽力描述我的问题。

我需要在顶级类中加载同一 JAR 的 2 个版本(v1.jar 和 v2.jar),以便我可以访问该 jar 的两个版本。这样做的原因是因为我想测试 v2.jar 中的任何功能是否比 v1.jar 有所退化

在我的顶级类中,我想调用 v1.jar 和 v2.jar 的方法,然后根据 v2 输出验证 v1 的输出。这样我就可以确定没有什么事情搞砸了。

class Common {

// Names of the classes would be the same so not sure how I would invoke the classes from the 2 different jars?
String resultv1 = EngineV1.run("a","b","c");
String resultv2 = EngineV2.run("a","b","c");

Assert.equals(resultv1, resultv2, "Regression has been introduced...");


}

我无法导入 v1 和 v2 jar 作为 Maven 依赖项,因为这会在 Maven 中产生版本冲突,并且默认情况下 Maven 将使用最新的 jar。所以我考虑创建一个通用接口(interface)并拥有该接口(interface)的 2 个不同的实现类。然后在顶层我可以使用类加载器来加载 v1 和 v2 jar 等。但这种方式不起作用,因为我必须更改生产 v1.jar 来实现通用接口(interface)。

任何帮助或见解将不胜感激。如果可能的话,我非常希望看到 sample 。请不要让我引用其他主题

最佳答案

您的测试类可以设置 ClassLoader对于每个 .jar 文件。最简单的方法是使用 URLClassLoader .

示例:

File jar1 = new File("/path/to/v1.jar");
File jar2 = new File("/path/to/v2.jar");

URLClassLoader v1Loader = URLClassLoader.newInstance(new URL[] { jar1.toURI().toURL() });
URLClassLoader v2Loader = URLClassLoader.newInstance(new URL[] { jar2.toURI().toURL() });

Class<?> engineClass1 = v1Loader.loadClass("org.example.Engine");
Class<?> engineClass2 = v2Loader.loadClass("org.example.Engine");

Method runMethod1 = engineClass1.getMethod("run");
Method runMethod2 = engineClass2.getMethod("run");

Object engine1 = engineClass1.newInstance();
Object engine2 = engineClass2.newInstance();

String result1 = (String) runMethod1.invoke(engine1);
String result2 = (String) runMethod2.invoke(engine2);

请注意,由于两个 .jar 文件都不在测试代码的类路径上,因此代码无法声明 .jar 文件中的任何类型的变量。所有来自测试代码的访问都必须使用反射来完成。

<小时/>

更新

您可能还需要在进行调用时更改上下文类加载器:

String result1, result2;
Thread thread = Thread.currentThread();
ClassLoader myLoader = thread.getContextClassLoader();
try {
thread.setContextClassLoader(v1Loader);
result1 = (String) runMethod1.invoke(engine1);
thread.setContextClassLoader(v2Loader);
result2 = (String) runMethod2.invoke(engine2);
} finally {
thread.setContextClassLoader(myLoader);
}
// Compare result1 and result2

关于java - 如何在1个Java类中加载同一个Jar的2个版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44295051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com