为啥 java.class.path 属性总是返回 jar 的位置?

Posted

技术标签:

【中文标题】为啥 java.class.path 属性总是返回 jar 的位置?【英文标题】:Why does the java.class.path property always return the location of the jar?为什么 java.class.path 属性总是返回 jar 的位置? 【发布时间】:2016-10-25 01:13:21 【问题描述】:

在Get location of JAR file 中,有人说“只要你的类路径只包含一个条目,这[获取可运行 jar 文件的位置] 才有效”。

这是我的代码:

   public static void main(String[] args) 
       System.out.println(System.getProperty("java.class.path"));
   

我创建了一个可运行的 jar(使用 Eclipse 导出),当我运行它时,无论我将 CLASSPATH 设置为什么,我都只会得到可运行 jar 的路径。

例如:

C:\TEMP>set CLASSPATH=C:\TEMP\BackupCompilations\Photos;C:\FreeOCR\tessdata

C:\TEMP>echo %CLASSPATH%
C:\TEMP\BackupCompilations\Photos;C:\FreeOCR\tessdata

C:\TEMP>set CLASSPATH
CLASSPATH=C:\TEMP\BackupCompilations\Photos;C:\FreeOCR\tessdata

C:\TEMP>java -jar C:\Programs\bin\Test_one_prop.jar
C:\Programs\bin\Test_one_prop.jar

我也尝试在命令行上使用 -cp。

有人能想出一个反例,它返回的东西比我正在运行的 jar 文件的位置多吗?

(明白在 Eclipse 中它会返回我项目的 bin 文件夹。)

这是我关心的唯一用例:将此程序作为可运行的 jar 运行。

谢谢。

【问题讨论】:

我很欣赏这两个答案。很棒的信息,每个链接都有一些链接;稍后将阅读更多内容。 (现在必须做一些有偿工作。) 【参考方案1】:

manual entry for java 状态

-jar

[...] 使用此选项时,JAR 文件是所有用户的来源 类和其他用户类路径设置将被忽略。

当使用-jar 选项时,.jar 本身被用作整个类路径。


有人能想出一个反例吗? 比我正在运行的 jar 文件的位置更多/其他的东西?

正常情况下不会。但是,它只是一个属性,因此您可以更改其值。

System.setProperty("java.class.path", "garbage");

正如 nramaker 在他们的 answer 中所建议的那样,您可以通过 MANIFEST 文件提供其他 jar 的位置以包含在类中。 Java 教程解释了如何做到这一点:

Adding Classes to the JAR File's Classpath

但是,这不会更改 java.class.path 属性的值。如果要从清单文件中提取Class-Path 属性的值,可以使用以下提供的解决方案:

Reading my own Jar's Manifest

一个例子,

URLClassLoader cl = (URLClassLoader) Example.class.getClassLoader();
try 
    URL url = cl.findResource("META-INF/MANIFEST.MF");
    Manifest manifest = new Manifest(url.openStream());
    System.out.println(manifest.getMainAttributes().getValue(new Attributes.Name("Class-Path")));
 catch (IOException e) 
    // handle

【讨论】:

【参考方案2】:

当您运行可执行 jar 文件时,类路径由 jar 文件内的清单文件中的内容定义。这将覆盖在命令行上传递或在环境中设置的任何内容。

http://anshuiitk.blogspot.com/2010/10/class-path-settings-in-excecutable-jar.html

【讨论】:

以上是关于为啥 java.class.path 属性总是返回 jar 的位置?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的碰撞测试总是返回“真”,为啥图像矩形的位置总是错误的 (0, 0)?

为啥这个函数总是返回0

为啥 GetIsNetworkAvailable() 总是返回 true?

为啥 location.getSpeed() 总是返回 0

为啥 WinAPI FormatMessage 失败,总是返回 false

为啥 -[UIKeyInput hasText] 总是为 UITextField 返回 NO?