gpt4 book ai didi

java - 通过类加载器以丑陋的方式忽略 JARS

转载 作者:搜寻专家 更新时间:2023-11-01 03:37:33 25 4
gpt4 key购买 nike

所以,我想在这里做一些丑陋的事情,可以说这是一个孤注一掷的措施,因为我无法控制运行时环境。

话虽如此,我在无法控制类路径的环境中运行一些代码(坏事)...更糟糕的是类路径有两个 jar,比方说 productV1.jar 和 productV2.jar两者完全相同,但版本不同,因此它们具有相同的类。

由于某些原因,在大多数环境中,productV2.jar 被加载而 productV1.jar 被遗漏,但在某些其他环境中,productV1.jar 被调用,导致程序崩溃。

作为解决方法,我想做的是弄乱类加载器以明确忽略“productV1.jar”。理想情况下通过覆盖一些类加载器函数。我已经使用其他资源(如 Hibernate 的 persistence.xml 文件)完成了此操作,但我不想根据包含的类进行过滤,而是根据 jar 文件进行过滤。有办法吗?

这只是为了工作,直到我可以进行谈判以摆脱有问题的 jar ......

编辑:如果有一些有趣的黑客攻击,我会保留这个问题。然而,问题在于 classpth 中的所有内容都由系统类加载器加载,并且尝试在运行时切换它并不是一件容易的事(或者可能根本不可能?)。我看到的唯一方法是使用自定义类加载器启动进程,这不是我想要的。

最佳答案

您是否尝试使用 URLClassLoader并手动将 jar 添加到类路径?在 URLClassLoader 的构造函数中,您传递一组指向您要加载的 jar 的 URL。

您可以进行以下实验:创建一个仅包含所需 jar 的 URLClassLoader 子类(即使用适当的 URL 数组调用 super 构造函数)然后使用以下属性调用您的 java:

-Djava.system.class.loader=test.CustomJarsClassloader

将您的类加载器设置为默认类加载器。

类加载器可能看起来像:

public class CustomJarsClassLoader extends URLClassLoader{
public CustomJarsClassLoader(){
super(new URL[]{ /*List of URLs to jars... */});
}
}

更新:

好的,如果您不能将此参数添加到命令行,请尝试另一种方法:

  1. 在您的 main() 函数中创建一个新线程
  2. 将我上面提到的类加载器设置为该线程的上下文类加载器(参见:javadocs)
  3. 在此线程中运行所有应用程序代码。您的类加载器应该用于加载类。

关于java - 通过类加载器以丑陋的方式忽略 JARS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26140877/

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