有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

classloader如何避免java库的类加载冲突

我们有一个java库(更像一个框架),可以用来构建JDBC驱动程序。框架实现了JDBC接口,您还实现了一些接口,这些接口是框架用来实现驱动程序的

出现的一个问题是,如果使用该框架创建两个驱动程序,并尝试在单个JVM中同时使用它们,则只会加载一组框架类

这是不好的,至少有两个原因:

  1. 该框架包含单例,因此只加载了第一个驱动程序 实际上是正确的
  2. 即使我们删除了所有单身人士 如果在加载时加载了框架的“错误版本”,则可能会中断 其中一个驱动程序的运行时

使用的解决方案是为每个驱动程序重命名框架类包,以便它们不再冲突。虽然这是可行的,但在我们的测试之后,字节码操作仍然存在问题

我的问题:有更好的方法吗?这需要从我们的角度来处理,而不是从应用程序的角度来处理,因为应用程序只是将驱动程序用作JDBC驱动程序,所以它需要透明

我的一个想法是将驱动程序的所有类(除了实现驱动程序/数据源的“入口点”类)序列化为某种资源,该资源打包在驱动程序jar中(资源和入口点类的FQN对于驱动程序是唯一的),然后在静态初始化块中拥有入口点类,读出这些类并用私有类加载器加载它们。这种方法有没有什么明显的问题我没有注意到


共 (0) 个答案