管理java类路径上的冲突

我暴露了我的背景:

我有两个在独特的Weblogic Server上运行的Java程序:程序A和程序B.这些程序由两个ksh启动:

programA.ksh和programB.ksh

两者都需要C.jar但是在不同的版本中(但具有完全相同的包和类):

  • 程序A需要C-1.0.jar
  • 程序B需要C-2.0.jar

我确切地说两个程序共享相同的weblogic类路径。

所以,我的classpath按顺序包含:

…..

C-1.0.jar

C-2.0.jar

…..

我怎么能这样做,每个程序找到它的好库?

例如,根据我的实际配置,程序B将始终使用C-1.0.jar而不是C-2.0.jar,因为类路径上的优先级位置。

如果为两个程序启动两个单独的JVM实例, 则不要使用相同的类路径! 这不是很明显吗?

您是否正在使用CLASSPATH环境变量? 这是一个非常古老,过时的做法,你不应该这样做。 使用-classpath命令行参数,这样您就可以轻松地为这两个程序使用不同的类路径。

旧答案:假设你在讨论线程而不是进程:

最好的解决方案是修复A,B或C,以便A和B都可以使用相同版本的C.

或者,如果C的两个版本实际上有不同的行为,请为它们使用不同的包或类名。

只有当你不能改变A,B或C时,你应该考虑编写一个包装器的技术解决方案,该包装器使用不同的A和B 类加载器 ,这样他们就会看到不同版本的C.

基本上你不能这样做(简单)。 看看http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell ,他们解释了标准的Java类加载器无法做到这一点。

你可以在不同的VM上运行这两个进程,也可以进入很多类加载器地狱……

您必须确保类路径中只有一个库。

最简单的方法是创建具有正确依赖关系的2个lib目录,并在启动脚本中为相应的进程引用所有jar。

这个简单的shell脚本将自动为您执行此操作:

MY_CLASSPATH=. for i in /path/to/A/lib/*.jar do MY_CLASSPATH=$MY_CLASSPATH:$i done java -cp $MY_CLASSPATH my.main 

我认为这些是Java Web应用程序,如果它们在WebLogic上运行,它们应该在WAR文件中。 如果每个JAR版本都将其各自的JAR版本放在其WAR文件的WEB-INF / lib中,则不会发生任何冲突。