为啥 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
属性的值,可以使用以下提供的解决方案:
一个例子,
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)?
为啥 GetIsNetworkAvailable() 总是返回 true?