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

Tam*_*ias 3 java executable-jar

获取JAR文件的位置时,只要你的类路径只包含一个条目,就会说"这可以[获取可运行的jar文件的位置]".

这是我的代码:

   public static void main(String[] args) {
       System.out.println(System.getProperty("java.class.path"));
   }
Run Code Online (Sandbox Code Playgroud)

我创建了一个可运行的jar(使用Eclipse Export),当我运行它时,无论我将CLASSPATH设置为什么,我只获得runnable 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
Run Code Online (Sandbox Code Playgroud)

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

有人可以提出一个反例,其中返回的东西比我正在运行的jar文件的位置更多/更多吗?

(理解在Eclipse中它返回我的项目的bin文件夹.)

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

谢谢.

Sot*_*lis 5

州的手动输入java

-jar

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

使用该-jar选项时,它.jar本身用作整个类路径.


有人可以提出一个反例,其中返回的东西比我正在运行的jar文件的位置更多/更多吗?

一般情况下,没有.但是,它只是一个属性,因此您可以更改其值.

System.setProperty("java.class.path", "garbage");
Run Code Online (Sandbox Code Playgroud)

正如nramaker在他们的回答中建议的那样,您可以通过MANIFEST文件提供其他罐子的位置以包含在类中.Java教程解释了如何执行此操作:

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

一个例子,

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
}
Run Code Online (Sandbox Code Playgroud)