【问题标题】:Two classes with same name in classpath类路径中具有相同名称的两个类
【发布时间】:2011-08-04 11:58:11
【问题描述】:

如果我有两个同名的类,说 Matcher.java 在我的类路径中的两个不同的 jar 中,其中一个将由 JVM 拾取,无论如何我可以建议 JVM 选择一个特定的吗?

【问题讨论】:

  • 虽然这个问题有明确的行为,但请告诉我,你自己永远不会有这样的命名冲突。软件包的存在是有原因的,对吧?
  • This 可能会有所帮助

标签: java classpath


【解决方案1】:

引用Oracle:

规格顺序

您指定多个类路径条目的顺序是 重要的。 Java 解释器将在 目录按照它们在类路径变量中出现的顺序。在 在上面的例子中,Java 解释器会首先寻找一个需要的 目录 C:\java\MyClasses 中的类。只有当它没有找到 该目录中具有正确名称的类将被解释器查找 在 C:\java\OtherClasses 目录中。

提到的例子:

C:> java -classpath C:\java\MyClasses;C:\java\OtherClasses ...

所以是的,它会加载出现在第一个指定的类路径中的那个。

【讨论】:

  • 如果我们使用通配符呢?例如。 java -cp C:\java\* ?那么它会先查看C:\java\A.jarC:\java\B.jar 还是未指明的行为?
  • 是否有可能加载第二个 jar 文件中的类。实际上我想避免这种情况,但我不确定。可能存在类也可以从第二个 jar 文件加载的情况?
【解决方案2】:

在类路径中找到的第一个。即,将使用包含您的类的第一个 jar。

您无法在 JVM 中控制它,但您可以控制类路径 - 确保在类路径中首先列出/找到您想要的。

【讨论】:

    【解决方案3】:

    有一种方法可以让您指定应该从哪里选择类。您可以创建自己的类加载器,它会根据您的要求加载类。

    您可以通过 2 种方式使用加载的类

    1. 将其作为参数传递给 jvm (java -Djava.system.class.loader =com.somepackage.YourCustomClassLoader com.somepackage.YourMainClass)
    2. 以编程方式使用类加载器加载特定类(请参阅提供的链接)。

    这里有一些关于类加载的有用链接

    【讨论】:

      【解决方案4】:

      使用时使用类的完全限定路径。但是如果你的意思是同名的类也有相同的包 - 修复类路径。

      【讨论】:

      • 问题是,如果您使用的是第三方 jar 文件,您怎么知道这一点!无论如何要解决这个问题?
      • @qartal Jar 只是一个专门的 Zip 文件。制作 Jar 的副本,将其从 .jar 重命名为 .zip,应该很容易检查里面的内容和位置。 JDK 还提供了 jar 工具,该工具具有列出 Jar 内容的选项。
      猜你喜欢
      • 2011-05-14
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      • 2013-02-16
      • 2011-11-20
      • 1970-01-01
      相关资源
      最近更新 更多