在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运行。
感谢。
答案 0 :(得分:5)
-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