【问题标题】:How to remove jar file from classpath during runtime?如何在运行时从类路径中删除 jar 文件?
【发布时间】:2018-04-25 19:54:53
【问题描述】:

我有一个 Apache Commons 库 (commons-io.jar) 添加到我的项目类路径中,我想在运行时从我的类路径中删除这个库类,然后我想在一些工作之后添加。

有没有办法在运行时从类路径中删除所有类并在某些操作后添加这些类?

public static void main(String [] args){

    //Some apache commons operations

    //Remove apache commons classes from classpath

    doSomeWork();

    //Add apache commons classes to classpath

}

【问题讨论】:

  • 非常怀疑,但更重要的是,你为什么要这样?
  • @Stultuske 库之间存在冲突,我必须同时使用这两个库。
  • 我建议 Maven 来处理这个问题
  • 是的,这是配置问题,不是你通过代码解决的问题。
  • @Java 这真的不是一个好主意。

标签: java classpath


【解决方案1】:

您遇到的问题称为classpath hell

Java 中没有这样的功能。这背后的原因是类加载器的设计,它只能加载类而不能卸载它们。很可能,即使在未来也不会发生这种情况。

您可以使用特殊的类加载器从不同的 jar 中加载不同的类,但即便如此,您也会很快遇到其他限制。例如,类加载器应该只在父类尚未加载类的情况下加载它。这意味着您的代码的其他部分不能使用 apache-commons.jar。您可以将您的程序分成两部分,并分别在其自己的类加载器/类路径中运行,但随后您会意识到 不能再在它们之间共享对象。以此类推。

最后,您可以 (a) 尝试找到适用于两者的 jar 组合,(b) 修复程序的一部分以便它与另一个 jar 一起使用,或者 (c) 破坏程序分成两部分,分别在不同的 JVM 中运行。

【讨论】:

    【解决方案2】:

    你可以在你的 pom 中使用 maven-enforcer-plugin 来强制传递依赖的特定版本。 Conflicting library version in a java maven project

    【讨论】:

    • 不,他不能。您正在为运行时问题提供构建时解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 2021-01-28
    • 2013-12-17
    • 2011-04-30
    • 2023-04-09
    • 2012-06-02
    相关资源
    最近更新 更多