哪个路径是 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.jarjava -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 依赖项 org.apache.poiooxml-schemas4.1.2 我怎么能在此处检索路径?你有什么想法请告诉我。我尝试使用 [***.com/questions/15359702/get-location-of-jar-file/… 但对我不起作用,我需要 getPath(groupid/artifactId) = 它显示 jar 文件所在的路径。 (或)任何其他替代方案也可以,至少它必须显示正在加载哪个版本的 jar 以及从哪个路径加载。?感谢您的时间和提前回答。 @Raki jar 文件名 includes groupid, artifactid, version (GAV) 除非您不遗余力地让 maven 制作不包含此的 jar 文件。即使没有,你也可以打开那个 jar 文件(它是一个 zip),清单(META-INF/MANIFEST.MF,它是里面的一个文件)会告诉你。 我找到了找到jar路径的答案。但是,与我提出的问题完全不匹配,但此代码有一种解决方法。也许,这已经在评论问题的堆栈溢出中讨论过`` String jarPath = ClassName.class .getProtectionDomain().getCodeSource() .getLocation().toURI().getPath();``` 那段代码是脆弱的、冗长的、毫无意义的:只是类本身的 URL 看起来像例如file:jar:/path/to/the/jarfile.jar!com/foo/ClassName.class - jar 文件就在中间。只是..拿眼球,指向屏幕,阅读它。

以上是关于哪个路径是 Java 中的第一优先级?的主要内容,如果未能解决你的问题,请参考以下文章

Linux中哪个实时优先级最高

Java中的算术运算符(初学者问题)

Java中的线程的优先级

在带有数字的列表中查找具有字母优先级的第一项

我在博客园的第一篇博客

java中运算符优先级