哪个路径是 Java 中的第一优先级?
Posted
技术标签:
【中文标题】哪个路径是 Java 中的第一优先级?【英文标题】:which path is the first priority in Java? 【发布时间】:2021-04-16 10:27:16 【问题描述】:如果.m2文件夹和javaclasspath中都有相同版本或不同版本的jars,则java首先试图找到罐子?以及哪条路径将是最高优先级?。
【问题讨论】:
这没有任何意义:Java 不只是随意决定在.m2
文件夹中搜索 JAR。它将占用类路径上的任何内容,仅此而已。因此,如果您在 .m2 中有版本 1,而在类路径中的某处有版本 2,则只会加载版本 2。 .m2 中的 jar 文件将通过将它们放在类路径中来使用。
感谢您的宝贵时间和回答。
@Joachim Sauer:你的意思是:如果我有一个版本 1 和版本 2 都在类路径中,那么 Java 会考虑版本 2 对吗?用于编译和运行时。
不,这根本不是我写的或想表达的意思。如果类路径中有某些类的多个版本,则将加载类路径中较早的版本。但这仍然会导致版本 2 中的类被加载,而版本 1 中不存在这些类并导致不兼容。
好的。谢谢,我明白了。
【参考方案1】:
Java,在 VM 中 (java.exe
) 将搜索类路径。这就是它结束的地方。 m2
是一个专家级的东西。它可能很流行,但它不是内置的,也不是虚拟机假定存在的。
实际上,m2 目录结构不能位于类路径本身。
这个想法是 maven 和其他工具将解析依赖项,然后制作一个包含完全正确所需依赖项的类路径(通过制作一个带有指向 .m2
目录的路径的字符串),然后使用这个制作的字符串进行编译作为类路径,或者如果您使用mvn test
或诸如此类,则使用此类路径运行VM(java.exe
)。在这些情况下,.m2
目录中的内容在类路径中。如果您只是自己运行 java(java -jar yourapp.jar
或 java -cp your:dirs com.foo.MainApp
或双击 jar),那么 .m2
不会涉及任何内容。
您总是可以编写一个应用程序来检查:
System.out.println(SomeClass.class.getResource("SomeClass.class"));
是打印一个字符串的代码,该字符串告诉您该类是从哪里加载的。适用于(几乎)任何东西,甚至是字符串:
System.out.println(String.class.getResource("String.class"));
因此,如果您不确定,这很容易找到。编写一个 hello world 应用程序,为您想知道它来自哪里的类型执行此操作。
【讨论】:
您的回答帮助我找到了课程,但是,我正在尝试找到 jar 路径。例如:这是我的 maven 依赖项file:jar:/path/to/the/jarfile.jar!com/foo/ClassName.class
- jar 文件就在中间。只是..拿眼球,指向屏幕,阅读它。以上是关于哪个路径是 Java 中的第一优先级?的主要内容,如果未能解决你的问题,请参考以下文章