首页 > 其他分享 >同一个服务需要使用同一个依赖(jar)的不同版本的解决方案(类加载器方案)

同一个服务需要使用同一个依赖(jar)的不同版本的解决方案(类加载器方案)

时间:2023-06-08 17:56:21浏览次数:40  
标签:字节 自定义 jar jarPath 版本 new 加载 同一个

当使用类加载器隔离来处理同一依赖的不同版本时,可以创建自定义的类加载器来加载各自的版本。以下是一个简单的示例,演示如何使用类加载器隔离不同版本的依赖:

// 自定义类加载器
public class CustomClassLoader extends ClassLoader {
    private String jarPath;

    public CustomClassLoader(String jarPath, ClassLoader parent) {
        super(parent);
        this.jarPath = jarPath;
    }

    @Override
    protected Class<?> findClass(String className) throws ClassNotFoundException {
        try {
            // 从指定路径加载类字节码
            byte[] classBytes = loadClassBytes(className);
            return defineClass(className, classBytes, 0, classBytes.length);
        } catch (IOException e) {
            throw new ClassNotFoundException("Failed to load class: " + className, e);
        }
    }

    private byte[] loadClassBytes(String className) throws IOException {
        // 从指定路径加载类字节码文件
        // 这里可以根据需要自定义加载逻辑
        // 例如,可以从不同的JAR包中加载字节码
        // 可以使用类似于以下代码的逻辑:
        // FileInputStream fis = new FileInputStream(jarPath);
        // // 从文件中读取类字节码
        // ...
        // fis.close();
        // 返回类字节码
        return null;
    }
}

// 使用类加载器隔离的微服务类
public class MyMicroservice {
    public void performAction() throws Exception {
        // 创建自定义类加载器,分别加载不同版本的依赖
        ClassLoader oldClassLoader = new CustomClassLoader("path/to/old-version.jar", Thread.currentThread().getContextClassLoader());
        ClassLoader newClassLoader = new CustomClassLoader("path/to/new-version.jar", Thread.currentThread().getContextClassLoader());

        // 使用不同版本的类加载器加载对应的类
        Class<?> oldDependencyClass = oldClassLoader.loadClass("com.example.OldDependency");
        Class<?> newDependencyClass = newClassLoader.loadClass("com.example.NewDependency");

        // 创建实例并调用方法
        Object oldDependency = oldDependencyClass.newInstance();
        Object newDependency = newDependencyClass.newInstance();

        // 调用旧版本依赖的方法
        Method oldMethod = oldDependencyClass.getMethod("oldDoSomething");
        oldMethod.invoke(oldDependency);

        // 调用新版本依赖的方法
        Method newMethod = newDependencyClass.getMethod("newDoSomething");
        newMethod.invoke(newDependency);
    }
}

在上面的示例中,CustomClassLoader是自定义的类加载器,它继承自ClassLoader。在findClass方法中,通过指定的路径加载对应类的字节码。您可以根据实际需求自定义加载逻辑,例如从不同的JAR包中加载字节码。

在MyMicroservice微服务类中,创建了两个不同的类加载器,分别用于加载不同版本的依赖。然后,使用各自的类加载器加载对应的类,并通过反射调用方法。

请注意,这只是一个简单的示例,实际场景中可能需要更复杂的类加载器逻辑

标签:字节,自定义,jar,jarPath,版本,new,加载,同一个
From: https://www.cnblogs.com/zhenhunfan2/p/17467255.html

相关文章

  • html照片从模糊到清晰的渐变加载显示方法
    1.背景介绍在网络相册应用中用户查看照片是最朴素的需求,当网络比较慢的时候查看照片等待的时间是比较长的,用户体验会很差。 2.现状现在加载照片的方法主要有一下两种:(1)最原始的方式在html页面直接用img标签加载显示照片。该方法在网络速度比较慢或者要显示的照片比较大的时候会......
  • jquery Mobile点击显示加载等待效果
    点击某个按钮或链接时,触发等待加载效果:<script><!--$(document).bind("mobileinit",function(){});$(function(){//默认设置,一个小圈圈在转$('#default').live('tap',function(){$.mobile.loadingMessageTe......
  • maven 打包时将 jar 也导入jar项目
    在pom.xml中添加代码<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>2.8</version>......
  • 使用GDB调试断点信息是gdb动态添加或取消的还是将断点烧录到elf文件的?断点信息是如何
    使用GDB调试断点信息是gdb动态添加或取消的还是将断点烧录到elf文件的?断点信息是如何加载进单片机的并进行加下来的调试运行的? from:GPT-4GDB(GNU调试器)是一个用于调试程序的强大工具,它可以让你设置断点、检查变量和内存、执行单步调试等。在单片机(微控制器)上使用GDB进行调试......
  • JDK没有JAVAX.ANNOTATION.JAR包解决方案,无法使用@RESOURCE解决方案
    高版本JDK无法使用@Resource注解解决方案1.普通项目下载javax.annotation-api-1.3.2.jar,并在lib目录中引入即可2.Maven项目Maven项目:在pom.xml中进行配置<dependency><groupId>javax.annotation</groupId><artifactId>jsr250-api</artifactId><ver......
  • Java类加载机制
    <1>Javac原理javac是用于将源码文件.java编译成对应的字节码文件.class。其步骤是:源码——>词法分析器组件(生成token流)——>语法分析器组件(语法树)——>语义分析器组件(注解语法树)——>代码生成器组件(字节码)<2>类加载过程先在方法区找class信息,有的话直接调用,没有的话则使用类加......
  • 明明加载好了css,js文件,页面的样式还是不对的解决办法
    页面内容的格式乱七八糟的…用F12开发人员工具检查了一下,没有发现任何问题最后,求助了bobby老师答曰:你缺乏前端知识,浏览器中有缓存,ctrl+f5强制刷新一下就好了恩,好了…......
  • 如何实现Java类隔离加载?
    一什么是类隔离技术只要你Java代码写的足够多,就一定会出现这种情况:系统新引入了一个中间件的jar包,编译的时候一切正常,一运行就报错:java.lang.NoSuchMethodError,然后就哼哧哼哧的开始找解决方法,最后在几百个依赖包里面找的眼睛都快瞎了才找到冲突的jar,把问题解决之后就开始......
  • KingbaseES sys_bulkload数据加载工具错误处理
    一、关于sys_bulkload数据加载工具sys_bulkload是KingbaseES提供的快速加载数据的命令行工具。用户使用sys_bulkload工具能够把一定格式的文本数据简单、快速的加载到KingbaseES数据库中,或将KingbaseES数据库中的数据快速导出到CSV文件中。使用前需要用户手动创建sys_bulkload插......
  • Axure教程—滚动加载(中继器 )
    本文将教大家如何用AXURE中的中继器制作滚动加载效果一、效果介绍如图: 预览及下载地址:https://awjggr.axshare.com二、功能介绍向下滚动鼠标,自动加载内容三、制作方法1、中继器制作拖入一个动态面板组件,命名为1,设置大小为800×500,如图: 进入动态面板1,拖入另一个动态面板......