【问题标题】:Dynamically manage two jar files with the same package and class names动态管理两个包名和类名相同的jar文件
【发布时间】:2011-01-26 00:19:51
【问题描述】:

我有两个来自客户端的 jar 文件,一个用于测试,另一个用于最终版本。目前,我将它们放在不同的文件夹中,并在部署代码时修改库路径,但如果能够同时加载两个 jar 文件并在运行时动态切换它们,那就太好了。

这可能吗?

【问题讨论】:

    标签: java class packages


    【解决方案1】:

    您始终可以编写自己的 ClassLoader 并将其与标准 ClassLoader 链接。

    http://download.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html

    10 年前我使用此方法加载通过套接字接收并在 XML 文件中指定的类(也通过套接字)。我的 java 程序在获得 XML 文件和类之前甚至不知道这些类已经存在。

    【讨论】:

    • 不能在使用动态加载类的源文件中导入包。那么在使用它们的文件中,您如何访问字段和方法?
    • 您必须动态加载类并在任何地方使用接口。我假设您已经在使用接口和工厂,因为我认为 testing 和 final 只是实现了相同的接口,但只是具有不同的实现。你只需要重写你的工厂来动态加载类。 MyInterface i = Class.forName("com.stackoverflow.MyTestClass", true, MyClassloader);
    【解决方案2】:

    使用 OSGi 包可以做到这一点。看看http://blog.springsource.com/2008/02/18/creating-osgi-bundles/。搜索“多个版本”。

    【讨论】:

    • 这可能有效,但我宁愿使用 Java 代码而不是外部解决方案
    【解决方案3】:

    贾斯汀,

    chrisparker2000 的建议看起来是最可行的 - 您必须编写一个自定义类加载器,我能想到的唯一更改是以下几行: 1. 对于客户端可交付的 jar - 比如 client.dev.jar 和 client.prod.jar,重命名为不同的扩展名并将它们放在类路径中。重命名为不同的扩展名,以防止容器加载 jar 的内容。

    1. 使用自定义类加载器,根据 chrisparker2000 提供的解决方案按需加载内容,方法是在客户端类顶部放置一个小外观,例如基于环境(开发/产品/其他)的 ClientClassFactory使用自定义类加载器从 client.dev.otherext 或 client.prod.otherext 加载。

    【讨论】:

      【解决方案4】:

      如果您使用像 maven 这样的构建工具,您可以为不同的范围(测试与生产)定义不同的 jar 文件(依赖项)。

      您还可以使用 maven 配置文件来定义不同的 jar 文件/版本集。

      【讨论】:

        猜你喜欢
        • 2020-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-25
        • 1970-01-01
        • 2011-05-07
        相关资源
        最近更新 更多