动态管理具有相同包和类名的两个jar文件

4

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

这种做法是否可行?

4个回答

6
你可以编写自己的ClassLoader,并将其与标准ClassLoader链接起来。 http://download.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html 我在10年前使用了这种方法来加载通过套接字接收并在XML文件中指定的类(同样通过套接字)。我的Java程序在获取XML文件和类之前甚至不知道这些类的存在。

在使用动态加载类的源文件中,您无法导入该包。那么在使用它们的文件中,如何访问字段和方法呢? - justinhj
你需要动态加载类并在各处使用接口。我假设你已经在使用接口和工厂,因为我认为测试和最终版本只是实现相同的接口但具有不同的实现。你只需要重写你的工厂以动态加载类。MyInterface i = Class.forName("com.stackoverflow.MyTestClass", true, MyClassloader); - bb121622

2

可能那样做可以行,但我宁愿用Java代码来完成,而不是使用外部解决方案。 - justinhj

1

justinjh,

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

  1. 使用自定义类加载器,根据chrisparker2000提供的解决方案,按需加载内容,通过在客户端类的顶部放置一个小门面(例如ClientClassFactory),该门面根据环境(dev / prod / anything else)使用自定义类加载器从client.dev.otherext或client.prod.otherext中加载。

1
如果您使用像Maven这样的构建工具,您可以为不同的范围(测试与生产)定义不同的JAR文件(依赖项)。
您还可以使用Maven配置文件来定义不同的JAR文件/版本集合。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接