【发布时间】:2011-08-04 11:58:11
【问题描述】:
如果我有两个同名的类,说 Matcher.java 在我的类路径中的两个不同的 jar 中,其中一个将由 JVM 拾取,无论如何我可以建议 JVM 选择一个特定的吗?
【问题讨论】:
-
虽然这个问题有明确的行为,但请告诉我,你自己永远不会有这样的命名冲突。软件包的存在是有原因的,对吧?
-
This 可能会有所帮助
如果我有两个同名的类,说 Matcher.java 在我的类路径中的两个不同的 jar 中,其中一个将由 JVM 拾取,无论如何我可以建议 JVM 选择一个特定的吗?
【问题讨论】:
引用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.jar 或C:\java\B.jar 还是未指明的行为?
在类路径中找到的第一个。即,将使用包含您的类的第一个 jar。
您无法在 JVM 中控制它,但您可以控制类路径 - 确保在类路径中首先列出/找到您想要的。
【讨论】:
有一种方法可以让您指定应该从哪里选择类。您可以创建自己的类加载器,它会根据您的要求加载类。
您可以通过 2 种方式使用加载的类
java -Djava.system.class.loader
=com.somepackage.YourCustomClassLoader com.somepackage.YourMainClass)这里有一些关于类加载的有用链接
【讨论】:
使用时使用类的完全限定路径。但是如果你的意思是同名的类也有相同的包 - 修复类路径。
【讨论】: