【问题标题】:manage conflict on java classpath管理 java 类路径上的冲突
【发布时间】:2012-01-01 04:56:46
【问题描述】:

我公开我的上下文:

我有两个 Java 程序在唯一的 Weblogic Server 上运行:程序 A 和程序 B。 这些是由两个 ksh 启动的:

programA.ksh 和 programB.ksh

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

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

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

所以,我的类路径按顺序包含:

.....

C-1.0.jar

C-2.0.jar

.....

我怎样才能让每个程序都找到它的好库?

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

【问题讨论】:

  • 您的术语有问题。进程不会“在 JVM 上运行” JVM 是一个(单个)进程。你说的是线程吗?
  • 是的,你是对的,实际上它是两个封装在 shell 脚本中的 java 启动器。我用更正重新编辑帖子
  • 你的问题还不是很清楚。如果您启动 java 两次(一次用于 A,一次用于 B),则 A 和 B 不会在同一个 VM 上运行。每个程序都有自己的虚拟机。是你在做什么吗?
  • 我刚刚更正了我的问题
  • 目前还不清楚。你有一台或两台 weblogic 服务器在运行吗? A 和 B 是什么类型的程序? Web 应用程序部署为战争文件?耳朵?企业应用程序的 jar 不应该在服务器的类路径中。他们应该在应用程序的战争或耳朵中。如果这些 jar 被部署为应用的一部分,则应用服务器能够使用冲突的 jar 部署两个应用。

标签: java dependencies classpath classloader


【解决方案1】:

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

【讨论】:

  • 没有Java WebApps,这些只是纯粹在J2SE 中的两个批次。 Weblogic 只支持名为 Jrisk(优先级)的特定 Persistence 框架
  • 它们是否部署在 WebLogic 服务器上?还是只使用一些 JAR? (您的意思是“专有”吗?)在这种情况下,您可以在运行作业的脚本中使用 -classpath 选项设置 CLASSPATH。
【解决方案2】:

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

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

旧答案: 假设您在谈论线程而不是进程:

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

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

只有当你无法更改 A、B 或 C 时,你才应该考虑编写一个使用 different classloaders 的包装器的技术解决方案,以便 A 和 B 看到不同版本的 C。

【讨论】:

  • 我同意你的回答 :) 我注意到我的问题并不清楚,所以我重新编辑了它。
【解决方案3】:

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

你可以在不同的虚拟机上运行这两个进程,或者进入很多类加载器地狱......

【讨论】:

    【解决方案4】:

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

    最简单的方法是创建 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 6或更高版本,他也可以直接使用 java -cp /path/to/A/lib/* my.Main
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多