2016-06-22 56 views
3

Get location of JAR file有人说,“只要你的类路径只包含一个条目,就可以工作[获取可运行jar文件的位置]”。为什么java.class.path属性总是返回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文件夹。)

这是唯一的使用情况下,我很担心:运行此程序作为一个可运行的罐子。

感谢。

+0

我明白这两个答案。伟大的信息,跟着每个链接中的一些;将在稍后阅读。 (现在必须做一些支付工作。) – Tamias

回答

4

manual entry for java状态

-jar

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

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


有人能拿出一个反例,其中该返回 更多的东西/比我跑的jar文件的位置等?

正常情况下,没有。然而,这只是一个属性,所以你可以改变它的价值。

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

由于nramaker他们answer建议,你可以提供其他罐的位置,通过清单文件中的类包括。 Java教程讲解如何做到这一点:

然而,这不会改变java.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 
} 
相关问题