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

时间:2016-06-22 22:14:21

标签: java executable-jar

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

这是我的代码:

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

我创建了一个可运行的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

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

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

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

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

感谢。

2 个答案:

答案 0 :(得分:5)

manual entry for java

  

-jar

     

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

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

  

有人可以提出一个反例来回复   我正在运行的jar文件的位置更多/不是什么?

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

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

正如nramaker在他们的answer中建议的那样,你可以通过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
}

答案 1 :(得分:3)

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

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